【问题标题】:Simple program for removing Duplicate elements in Java using list使用列表删除Java中重复元素的简单程序
【发布时间】:2016-12-27 10:29:15
【问题描述】:

我是初学者,我试图在给定列表中查找重复元素,但由于某种原因,我将元素 3 打印了两次。谁能帮帮我?

输出:

1 1 2 2 3 3 3 3 3 3 3 4 4 4 5 5 6 6

重复元素

1 2 3 3 3 3 4 5 6

3 4

删除重复元素

1 2 3 3 4 5 6

public class Duplicate {
    public static void main(String[] args) {        
        int[] array={1,2,2,3,3,4,5,5,3,4,3,4,6,6,1,3,3,3};  
        Arrays.sort(array);             
        List<Integer> list=new ArrayList<Integer>();
        for(int x:array)
            list.add(x);
        for(int i=0;i<list.size();i++)
            System.out.print(list.get(i)+" ");
        System.out.println("\nDuplicate element(s)");
        for(int i=0;i<list.size();i++){
            for(int j=i+1;j<list.size();j++){
                if((list.get(i)==list.get(j))){
                    System.out.print(list.get(j)+" ");
                    list.remove(j);                     
                }               
            }
        }
        System.out.println();
        for(int i=0;i<list.size();i++){
            for(int j=i+1;j<list.size();j++){
                if((list.get(i)==list.get(j))){
                    System.out.print(list.get(j)+" ");
                    list.remove(j);     
                }
            }
        }       
        System.out.println("\nDuplicate element(s) removed");       
            for(int i=0;i<list.size();i++)
            System.out.print(list.get(i)+" ");
    }
}

【问题讨论】:

标签: java


【解决方案1】:

您可以使用集合,但问题是,您需要用 Integer 类包装原语...顺便说一句,使用 jdk 8 会更容易

   public static void main(String[] args) {
    Integer[] array = { 6, 1, 2, 2, 3, 3, 4, 5, 5, 3, 4, 3, 4, 6, 6, 1, 3, 3, 3 };
    Set<Integer> setJder = new LinkedHashSet<>(Arrays.asList(array));
    System.out.println(setJder );


    //  since JDK 8
    Set<Integer> mySet = Stream.of(6, 1, 2, 2, 3, 3, 4, 5, 5, 3, 4, 3, 4, 6, 6, 1, 3, 3, 3)
        .collect(Collectors.toCollection(HashSet::new));
    System.out.println(mySet);
    }

【讨论】:

    【解决方案2】:

    试试这个:

    public static void main(String[] args) {
    
        int[] array = {1, 2, 2, 3, 3, 4, 5, 5, 3, 4, 3, 4, 6, 6, 1, 3, 3, 3};
        Arrays.sort(array);
        List<Integer> list = new ArrayList<>();
        for (int x : array) {
            list.add(x);
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
        System.out.println("\nDuplicate element(s)");
        Integer last = null;
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            Integer n = it.next();
            if (n.equals(last)){
                System.out.print(n + " ");
                it.remove();
            }
            last = n;
        }
        System.out.println();
    
        System.out.println("\nDuplicate element(s) removed");
    
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
    }
    

    编辑:

        System.out.println("\nDuplicate element(s)");
        for (int i = 0; i < list.size(); i++) {
            for (; (i+1) < list.size() && (list.get(i).equals(list.get(i+1)));) {
                System.out.print(list.get(i+1) + " ");
                list.remove(i+1);
            }
        }
        System.out.println();
    

    【讨论】:

    • 你能告诉我为什么我得到两个 3 吗?还有没有办法只使用 for 循环来做到这一点?
    • @suze 已编辑,您不需要另一个 var (j) 只需与下一个元素 (i + 1) 进行比较。
    【解决方案3】:

    使用 set 你可以做到这一点。

    Integer[] arr = {1,2,2,3,3,4,5,5,3,4,3,4,6,6,1,3,3,3};
    Set<Integer> mySet = new HashSet<Integer>();
        Collections.addAll(mySet, arr);
        System.out.println(mySet); 
    

    【讨论】:

      【解决方案4】:

      如果您不希望集合中有重复项,则应考虑为什么要使用允许重复项的集合。删除重复元素的最简单方法是将内容添加到 Set(不允许重复),然后将 Set 添加回 ArrayList:

      ArrayList<Integer> al = new ArrayList<Integer>(Arrays.asList(array));
      Set<Integer> hs = new HashSet<Integer>();
      hs.addAll(al);
      al.clear();
      al.addAll(hs);
      

      但这会破坏 ArrayList 中元素的顺序。

      【讨论】:

        【解决方案5】:

        另一种方法是使用计数排序逻辑。或者像之前的 cmets 状态使用哈希集或树集,这取决于您是否需要对它们进行排序。但是如果您使用集合,请记住检查 . hashCode() 和 .equals() 正常工作

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-19
          • 1970-01-01
          • 2020-08-02
          • 2018-05-02
          • 2014-07-06
          • 2021-06-11
          • 1970-01-01
          相关资源
          最近更新 更多