2013-03-13 63 views
-5

我试图检查一个字符串是否存在于一个相对较大(如8000条目)的字符串列表中。Java在一大串字符串中检查.equals

这就是我所做的:

for (int i = 0; i < listOfStrings.size(); i++){ 
     String trim = listOfStrings.get(i).getString().trim(); 
     if (trim.equals(testString)){ 
      check = true; 
      break; 
     } else { 
      check = false; 
     } 
    } 

不过,虽然我敢肯定字符串是在列表中,我得到一个错误的回报。这是大型列表的错误方法吗?

编辑:

对不起没有上下文剪断的代码。是的休息;不见了。

+1

哇,什么是getString()调用? – BlackVegetable 2013-03-13 16:47:27

+2

您是否考虑过使用一组字符串,例如HashSet ?这将允许以更多内存为代价的更快搜索。 – 2013-03-13 16:50:01

+0

getString()是数据模型中getX的占位符。我会研究HashSets thx – Chromos 2013-03-13 16:58:17

回答

7

您可能会得到一个匹配并将check设置为true,但您并未终止循环。然后下一个循环不匹配,并将check设置为false。一旦找到break声明,就终止循环。

+1

更不用说你正在使用trim(),这会引发比较没有正确完成。假设您在包含“Bye World”和“Hello World”的列表中查找“Hello World”:它们将被视为“ByeWorld”和“HelloWorld”,因此您会得到一个错误的不匹配,而不是由不正确的方式激发你分配“检查”而不返回,但通过使用trim()。 – 2013-03-13 16:51:44

+0

我不知道'listOfStrings'的实际类型是什么,它可能是'List '。也许这就是为什么'getString()'被调用。也许OP需要调用'trim'。我所知道的是,OP以某种方式得到一个修剪过的'String',并且需要确定这是否是找到匹配的循环。另外,'trim()'不会消除字符串中间的空白,只在开始和结束时。 – rgettman 2013-03-13 16:55:59

+0

是的,遗憾的是代码被剪掉了。它带有datamodel的列表和字符串必须被修剪。regulary他们没有空格 – Chromos 2013-03-13 17:03:33

4

您需要在找到匹配后返回。否则,下一个不匹配将重置check = false。

3

您编写该循环的方式,除非您的字符串是列表中的最后一个字符串,否则检查将为假。你需要返回true,或者在那里休息一下。

2

除非列表中的最后一个字符串是匹配项,否则这将始终返回false,因为检查值在匹配不匹配时会设置为false(替换任何真值)。在发现匹配值后使用break

另外,为什么你需要getString()调用?如果列表中充满了字符串,是不是没有必要?

我相信这将是一个正确的定位点(假设你已经比较之前修剪每串一个很好的理由):

for (int i = 0; i < listOfStrings.size(); i++){ 
    String trim = listOfStrings.get(i).trim(); 
    if (trim.equals(testString)){ 
     check = true; 
     break; 
    } else { 
     check = false; 
    } 
} 
1

我觉得你得到的虚假申报,因为你没有打破for循环当你找到字符串。

1

最好将String存储为HashSet,它使用散列搜索,它应该更高效。