arraylist.remove不能正常工作

时间:2014-03-18 02:37:24

标签: java arrays arraylist

我有一个排序的整数数组,想要删除重复项,我写了下面的代码

package practice;
import java.util.*;

public class pb1 {

public static void removeDup(int[] theArray){       

    ArrayList<Integer> hold=new ArrayList<Integer>();


    for(int i=0;i<theArray.length-1;i++){


            hold.add(theArray[i]);

            //System.out.println(hold);

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

    }
    System.out.println(hold);
}


public static void main(String[]args){
    int[] now={1,1,2,2,3,4,4,4,5,5,5,5};
    removeDup(now);



}

}

尝试使用arraylist.remove方法删除重复项,但我仍然可以在打印的arraylist中看到重复项。我不知道为什么,请有人帮助我吗?感谢

4 个答案:

答案 0 :(得分:1)

另一种解决方案。这利用了Set不允许重复条目的事实,并大大简化了代码。

public class pb1 
{

public static void removeDup(int[] theArray)
{       
    Set<Integer> hold=new TreeSet<Integer>();
    for(int i=0;i<theArray.length-1;i++)
    {
        hold.add(theArray[i]);
    }
    System.out.println(hold);
}


public static void main(String[]args)
    {
     int[] now={1,1,2,2,3,4,4,4,5,5,5,5};
     removeDup(now);
    }
}

输出:

[1, 2, 3, 4, 5]

答案 1 :(得分:0)

向后迭代。向前删除项目将删除当前元素然后递增计数器/索引,从而跳过可能的重复项。用以下代码替换你的循环:

for(int i = hold.size() - 1; i >= 1;i--){
    if(hold.get(i)==hold.get(i - 1)){
        hold.remove(i);
    }
}
编辑:您的代码连续三次失败 当您的索引位于第4位时:

{1,1,2,2,3-,&GT; 4,4,4,5,5,5,5}

它会检查下一个元素。它会删除当前元素,因为它会在它前面看到4,但这就是bug出现的地方。

{1,1,2,2,3,4,>4,5,5,5,5}

删除前4个后续数组元素MOVE BACK然后你递增你的计数器,从而跳过另一个4. Ergo,重复。

答案 2 :(得分:0)

为什么要手动删除重复项?您可以复制列表以设置删除重复项,然后再次从set复制到列表。像这样的东西

ArrayList aList = new ArrayList();
LinkedHashSet link = new LinkedHashSet();
link.addAll(aList);
aList.clear();
aList.addAll(link);

答案 3 :(得分:0)

试试这个:

for (int i = 0; i < theArray.length - 1; i++) {

           if (!hold.contains(theArray[i]))

                hold.add(theArray[i]);

}

System.out.println(hold);