在ArrayList <string>中使用.contains出错

时间:2016-02-24 01:46:37

标签: java string arraylist

我必须检查一个字符串列表,如果之前没有处理过字符串,那么我们在字符串上做一些。对于他的问题,我在处理之后将每个String添加到ArrayList<String>并在处理之前检查字符串是否存在于not的列表中。但由于某些原因,虽然字符串存在于数组列表中,但它不起作用。

ArrayList<String> strings=new ArrayList<String>();
while(true) {
   if(!strings.contains(someString)) {
      System.out.println(someString);
      strings.add(someString);
   }
}

修改

当我提到它不起作用时,我的意思是if条件应该为类似的字符串返回false(因为它们彼此包含),而是它不这样做然后程序进入if声明。

输入:

http://www.foo.bar以及http://www.foo.bar/http://www.foo.bar

输出:

只应打印第一个网址。

3 个答案:

答案 0 :(得分:3)

尝试这样做:

while(true) {//dont know why you have this endless loop
   boolean flag = false;
   for (String s : strings) {
       if (s.toUpperCase().contains(someStrings.toUpperCase()) || someStrings.toUpperCase().contains(s.toUpperCase())) {
           flag = true;
           //the string already exists
           break;
       }
   }
   if (flag) {
   //to do if string already exists
   } else {
       strings.add(someStrings);
   }
}

我现在明白了。请再次检查。

答案 1 :(得分:2)

您在ArrayList(&#34; http://www.foo.bar&#34;和&#34; http://www.foo.bar/&#34;)中添加了不同的字符串,您就是期望通过contains方法将它们视为相同。这不起作用; contains仅在字符串完全相同时才有效。

鉴于有数百种可以想象的方法可以将字符串视为&#34;类似的&#34;,因此没有内置支持这种&#34;相似性检查&#34也就不足为奇了34。

在将字符串放入列表之前,一种简单的方法就是 canonicalize 你的字符串。

在您的情况下,您希望字符串被认为是相同的,无论它们是否以斜杠结尾。您可以通过确保字符串始终以斜杠结尾,然后将它们放入列表中来规范化它们:

if (!someString.endsWith("/")) {
    someString += "/";
}

(另一种选择是在字符串之间考虑edit-distance;但是你需要一个特殊的数据结构来存储它们,普通的ArrayList是不够的。)

答案 2 :(得分:0)

我的立场得到了纠正 - 以下内容与ArrayList.contains()相同。

private static ArrayList<String> myList = new ArrayList<String>();
public static void main(String[] args) {
    for (int i = 0; i < 10; i++) myList.add("aString" + i);
    if (myList.contains("aString3")) System.out.println("Contains is true");
    else System.out.println("Contains is false");
}

打印“包含为真”。对不起的信息感到抱歉。

使用ArrayList.contains(Object)时,您正在检查列表是否包含该确切对象。在您的情况下,您希望执行String by String比较而不是对象比较。

for (String string : strings) {
  if (someString.contains(string)) {
    //Do stuff
  }
}