我有一个排序的整数数组,想要删除重复项,我写了下面的代码
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中看到重复项。我不知道为什么,请有人帮助我吗?感谢
答案 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);