检查拼字游戏单词列表中的确切单词



我有一个拼字游戏时钟,里面有一个验证工具。 如果我检查的单词在列表中,则验证单词空间显示为绿色或红色。

问题是,如果我使用sbuffer.toString().contains并写一个像ABA这样的单词,单词空间看起来是绿色的,虽然ABA不在列表中,但ABACABACA在列表中。

我想知道如何在我的代码中实现一个条件来检查确切的完整单词。

我已经研究了正则表达式、边界和匹配,但我找不到在我的代码中单词的行代码。

这是我到目前为止的代码。

public class MainActivity extends AppCompatActivity {
TextView textView;
TextView textInV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.texto_1);
textView.setMovementMethod(new ScrollingMovementMethod());
textInV = findViewById(R.id.textIn);
String data = "";
StringBuffer sbuffer = new StringBuffer();
InputStream is = this.getResources().openRawResource(R.raw.fruits);
BufferedReader reader = new BufferedReader((new InputStreamReader(is)));
if (is != null)
{
try
{
while((data =reader.readLine())!=null)
{
sbuffer.append((data + "n"));
}
is.close();
}
catch (Exception e){ e.printStackTrace();}
}
textView.setText(sbuffer);
}
}

字符串上的contains方法测试目标是否作为子字符串包含;如果ABAC作为子字符串包含,那么ABA也是如此,因为ABAABAC的子字符串,因此它也是任何字符串的子字符串,ABAC是子字符串。因此,从逻辑上讲,String.contains方法不可能为ABAC返回true,为ABA返回false

您希望测试目标是否是字符串集合的元素之一,因此您应该对字符串集合而不是字符串使用contains。最好的选择是HashSet,因为它平均在O(1(时间内执行成员测试。

> import java.util.*;
> Set<String> allowed = new HashSet<>();
> allowed.add("ABAC");
> allowed.add("ABACA");
> allowed.contains("ABA")
false
> allowed.contains("ABAC")
true

正如@Ashutosh KS已经提到的,在这种情况下,String.contains并不是您要查找的:您要检查两个字符串是否相同,而不是一个字符串是否包含另一个字符串。

JavaString类包含一些可用于比较两个字符串内容的方法,您可以相应地选择这些字符串以匹配您的确切用例:

  1. contentEquals(CharSequence cs)contentEquals(StringBuffer sb)都检查传递的字符串表示的内容是否与当前内容匹配。
  2. equals(Object str)contentEquals类似,因为它在两个字符串之间进行精确比较,但它也会检查以确保传递的对象实际上是字符串。
  3. 顾名思义,equalsIgnoreCase(String anotherString)将在忽略字符串大小写的同时进行检查。

这些是比较本机 API 公开的两个字符串的"正确"方法,因此虽然绝对可以使用其他方法,但坚持使用这些方法是个好主意。

StringBuffercontains()检查给定的字符串是否是sbuffer中文本的子字符串。这意味着,它将输出用于在">ABC",">ABC BC","ZABC","ZABCBC"中搜索"ABC"的true...

如果要在sbuffer中搜索完整的单词,则可以查找"n" + "ABC" + "n",因为在向sbuffer添加单词时会添加"":sbuffer.append((data + "n"));。但是,您还必须使用 ""初始化sbufferStringBuffer sbuffer = new StringBuffer("n");

sbuffer.toString().contains("n" + "ABC" + "n"); // this will do the trick

测试代码:

class Main {
public static void main(String[] args) {
StringBuffer sbuffer = new StringBuffer("n");
StringBuffer sbuffer2 = new StringBuffer("n");
sbuffer.append("ABC" + "n");
sbuffer.append("ABCBC" + "n");
sbuffer.append("ZABC" + "n");
sbuffer.append("ZABCBC" + "n");
System.out.println("Is ABC in sbuffer = " + sbuffer.toString().contains("n" + "ABC" + "n"));
sbuffer2.append("ABCBC" + "n");
sbuffer2.append("ZABC" + "n");
sbuffer2.append("ZABCBC" + "n");
System.out.println("Is ABC in sbuffer2 = " + sbuffer2.toString().contains("n" + "ABC" + "n"));
}
}

测试输出:

Is ABC in sbuffer = true
Is ABC in sbuffer2 = false

现在我有了这个,并且可以工作,但我有一个带有单词的文件,我想在 diccionario 中添加这些文件。

但是我不知道如何读取文件。我尝试过缓冲区读取,但我需要尝试/捕获,并且不起作用......

其他一些解决方案....

谢谢

boton2.setOnClickListener(new View.OnClickListener()
{
String content;
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View view)
{
HashSet<String> diccionario = new HashSet<String>();
//Adding elements to HashSet
diccionario.add("CASA");
diccionario.add("ABAC");
if(diccionario.contains(textIn.getText().toString().toUpperCase()))
{
textIn.setBackgroundColor(Color.GREEN);
}
else
{
textIn.setBackgroundColor(Color.RED);
}
}

最新更新