Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ArrayList中使用.contains<;字符串>;出了差错_Java_String_Arraylist - Fatal编程技术网

Java 在ArrayList中使用.contains<;字符串>;出了差错

Java 在ArrayList中使用.contains<;字符串>;出了差错,java,string,arraylist,Java,String,Arraylist,我必须检查字符串列表,如果之前没有处理该字符串,那么我们对该字符串进行一些处理。就他而言,我在处理之后将每个字符串添加到ArrayList,并在处理之前检查该字符串是否存在于not列表中。但由于某些原因,尽管字符串存在于数组列表中,但它不起作用 ArrayList<String> strings=new ArrayList<String>(); while(true) { if(!strings.contains(someString)) { Syste

我必须检查字符串列表,如果之前没有处理该字符串,那么我们对该字符串进行一些处理。就他而言,我在处理之后将每个字符串添加到
ArrayList
,并在处理之前检查该字符串是否存在于not列表中。但由于某些原因,尽管字符串存在于数组列表中,但它不起作用

ArrayList<String> strings=new ArrayList<String>();
while(true) {
   if(!strings.contains(someString)) {
      System.out.println(someString);
      strings.add(someString);
   }
}
ArrayList strings=new ArrayList();
while(true){
如果(!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

输出:


应该只打印第一个URL。

我已更正-下面的操作与ArrayList.contains()相同


试着这样做:

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);
   }
}

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

您在
数组列表中放置了不同的字符串(“”和“”),您希望
contains
方法将它们视为相同的字符串。那不行<代码>包含
仅当字符串完全相同时才起作用

假定有数以百计可想象的方式,你可以认为字符串是“相似的”,所以不存在对这种“相似性检查”的内置支持。 一种简单的方法是在将字符串放入列表之前对其进行修改

在您的例子中,您希望字符串被认为是相同的,不管它们是否以斜杠结尾。您可以通过确保字符串在放入列表之前始终以斜杠结尾来规范化它们:

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

(另一个选项是考虑字符串之间的关系;但是,您需要一个特殊的数据结构来存储它们,一个普通的数组列表就不足以满足)。

但是如果一个字符串像<代码>书<代码>,另一个是<代码>图书< /代码>,我想把它们看作是同一个东西。
.equal
会处理这个问题吗?在他的情况下,使用toString()会不会也起作用,因为它会将对象转换为字符串?只是大声思考。我还没有考虑清楚。然后我想,您可以用.contains()替换.equals。对吗?您发布的内容正是
方法所包含的内容。没有区别。所以这并不能解决问题。@lonesome:我认为@Janleyu的推荐会解决你的问题。在
阵列列表
上使用
.contains
时,对象必须完全相等。你说的“它不工作”是什么意思?。请准确描述您期望发生的事情,以及实际发生的事情。包括您遇到的任何异常/堆栈跟踪。@ErwinBolwidt它不起作用意味着对于相同或非常相似的字符串,它不会返回false。因此它进入了不正确的
if
语句中。发布不起作用的确切代码。您说的是“非常相似”-非常相似并不完全相同,因此
contains
方法返回
false
。如果您只想确定字符串是否已存在,请使用哈希集。请提供实际输出和预期输出的示例。就像欧文说的@我认为它不能正常工作。首次运行,列表添加
http://www.foo.bar
。然后,列表将添加
http://www.foo.bar/
。因为
bar
不包含
bar/
我更新了我的答案。请查收@Lonesome我的回答也是正确的,因为Manh LeIt的工作是正确的@对于高级比较,您应该使用
正则表达式来覆盖您的情况。我们需要根据您的示例修改比较条件,但根据您的实际数据,它可能不起作用。因为Erwin的答案较短,并且与我的代码更匹配,所以我只对您的进行了更新投票。
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);
   }
}
if (!someString.endsWith("/")) {
    someString += "/";
}