0

我可以删除大多数重复项,除了那些紧挨着的。我不知道我做错了什么。现在我已经嵌套了 for 循环,将 int 与 ArrayList 中的其余部分进行比较。除了我如何设置或增加我正在跳过我再次开始第一个 for 循环的位置旁边的重复项。我发现在删除索引 j 后重置 i=0 很有用。如果它们彼此相邻,它仍然不会删除重复项。

for(int i=0;i<original.size();i++){
    for(int j=i+1;j<original.size();j++){
        if(original.get(i)==original.get(j)){
            original.remove(j);   
        }
    }
}

编辑:我找到了我的解决方案,当我将第二个 for 循环更改为 while 循环,然后每次递增,但是当我发现重复时,我从 j 中删除了 1。这样我就可以重新开始了。

谢谢你们。

4

10 回答 10

1

您应该使用迭代器来删除列表中的元素,而不是使用列表本身。

于 2013-11-11T05:32:08.697 回答
1

笔记:

1)从 Arraylist 中删除,大小将减小,索引将减小

前任:

如果原始数组列表是: {a,b,c,d} ,并且索引 i = 2 (c) ;如果您删除 original(2) ( ===== remove c from the original ) 索引将是 i++ 引用 original(3) 它不存在!!!!

2)你的对象的类型是什么???如果它们是字符串,那么您将使用.equal()

于 2013-11-11T05:33:51.957 回答
0

Not sure why you wouldn't want to use a HashSet, regardless you need to use .equals() instead of ==, since you're looking at the value, not the reference. Additionally, if you're using loops and you remove an element from the list, you don't want to increment j as this will skip an element, which obviously you don't want to do.

于 2013-11-11T05:42:35.480 回答
0

假设列表如下所示:[a,a,a,b,c,a]

这是迭代的样子(视图是在迭代完成后,删除或不删除):

i=0, size = 6 , j=1, arr[i] = a, arr[j] = a, view: [a,a,b,c,a]; (arr[i]==arr[j], will delete)
i=0, size = 5,  j=2, arr[i] = a, arr[j] = b, view: [a,a,b,c,a]; (arr[i]!=arr[j])
i=0, size = 5,  j=3, arr[i] = a, arr[j] = c, view: [a,a,b,c,a]; (arr[i]!=arr[j])
i=0, size = 5,  j=4, arr[i] = a, arr[j] = a, view: [a,a,b,c];   (arr[i]==arr[j], will delete)
i=1, size = 4,  j=2, arr[i] = a, arr[j] = b, view: [a,a,b,c];   (arr[i]!=arr[j])
i=1, size = 4,  j=3, arr[i] = a, arr[j] = c, view: [a,a,b,c];   (arr[i]!=arr[j])
i=2, size = 4,  j=3, arr[i] = b, arr[j] = c, view: [a,a,b,c];   (arr[i]!=arr[j])
i=3, size = 4, .......

邻居不会删除,因为 j=i+1,它永远不会有机会互相检查,因为一旦你删除一个元素,数组就会向下移动一个索引,所以在下一次迭代中,你要检查的项目实际上是跳过是因为j=i+1

于 2013-11-11T05:48:29.893 回答
0

使用 obj.equals(obj other) 函数来比较字符串或对象,而不是 == 运算符。

  for(int i=0;i<original.size();i++){
  for(int j=i+1;j<original.size();j++){
      if(original.get(i).equals(original.get(j))){
          original.remove(j);
      }
  }
  }

如果要根据该对象的某个值删除对象,则需要覆盖 bean 类的 equals 方法。请查看java中的equals方法。如果您覆盖 bean 类,则不需要两个 for 循环来删除重复项。您可以在将对象添加到数组列表时避免重复。

于 2013-11-11T05:38:47.737 回答
0
ArrayList<String> wordDulicate = new ArrayList<String>();
ArrayList<String> tempList= new ArrayList<String>();

    wordDulicate.add("7");
    wordDulicate.add("7");
    wordDulicate.add("7");

    for (String dupWord : wordDulicate)
    {
      if (!tempList.contains(dupWord)) 
      {
        System.out.println(dupWord);
        tempList.add(dupWord);
      }
    }

templist你不会得到重复的条目。

于 2013-11-11T06:23:28.480 回答
0

使用equals而不是==. 更改 if 语句,如:

 original.get(i).equals(original.get(j))
于 2013-11-11T05:31:00.720 回答
0

每当您在 List 上按索引循环并删除时,您必须循环 "backwards"。让 j 向后循环。否则,您最终会跳过条目。正如@BinaryMan 也指出的那样。

例如(注意,也使用 equals() 代替 ==)

for(int i=original.size()-1;i>=0;i--){
    for(int j=original.size()-1;j>i;j--){
        if(original.get(i).equals(original.get(j))){
            original.remove(j);   
        }
    }
}
于 2013-11-11T05:46:44.917 回答
0

如果数组元素是整数,那么首先对数组进行排序会更有效

    Collections.sort(list);
    Iterator<Integer> i = list.iterator();
    int prev = i.next();
    while (i.hasNext()) {
        int next = i.next();
        if (next == prev) {
            i.remove();
        } else {
            prev = next;
        }
    }

请注意,original.get(i)==original.get(j)对于整数不比较值,即new Integer(1000) == new Integer(1000)产生false

于 2013-11-11T05:51:20.107 回答
0
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

public class RemDupFromList {

    public static void main(String[] args)
    {
        List li = new ArrayList();

              li.add("one");
              li.add("two");
              li.add("three");
              li.add("one");//Duplicate
              li.add("one");//Duplicate

             // We have facility to pass a List into Set constructor and vice verse to cast      

                List li2 = new ArrayList(new HashSet(li)); //no order

             // List li2 = new ArrayList(new LinkedHashSet(li)); //If you need to preserve the order use 'LinkedHashSet'

             Iterator it= li2.iterator();
             while(it.hasNext())
             {
                 System.out.println(it.next());
             }

    }
}
于 2013-11-11T05:59:41.920 回答