【问题标题】:remove duplicates from object array data java从对象数组数据java中删除重复项
【发布时间】:2010-06-12 10:29:52
【问题描述】:

我想知道如何删除对象中的重复项。

例如

cat c[] = new cat[10];

c[1].data = "ji";
c[2].data = "pi";
c[3].data = "ji";
c[4].data = "lp";

c[5].data = "ji";
c[6].data = "pi";
c[7].data = "jis";
c[8].data = "lp";

c[9].data = "js";
c[10].data = "psi"; 

我想从对象数组中删除重复值。

感谢并提前

【问题讨论】:

  • 请注意,在 Java 中,数组索引是从 0 开始的,即在上面的数组中,现在 c[0] 为空,对 c[10] 的引用会导致 ArrayIndexOutOfBoundsException .索引应该是 0..9。

标签: java arrays object


【解决方案1】:

我假设您想创建另一个无重复的数组。 (因为你不能改变数组的大小)

您可以实现 hashCode 和 equals 并使用 HashSet,但是没有这些您可以创建 Comparator。

不过最简单的方法可能是使用“Cat”类和“cats”数组

Cat[] cats = { ... };
Set<String> datas = new HashSet<String>();
List<Cat> catList = new ArrayList<Cat>();
for(Cat cat: cats) if(datas.add(cat.data)) catList.add(cat);
Cat[] unqiueCats = catList.toArray(new Cat[catList.size()]);

【讨论】:

    【解决方案2】:

    这样的东西应该有效吗?确保导入 java.util.Arrays 和 java.util.HashSet。

    /**
     * Removes duplicates from an array. Objects in the array must properly
     * implement hashCode() and equals() for this to work correctly.
     */
    public static <E> E[] removeDuplicates(E[] array) {
      // convert input array to populated list
      List<E> list=Arrays.asList(array);
    
      // convert list to populated set
      HashSet<E> set=new HashSet<E>();
      set.addAll(list);
    
      // convert set to array & return, 
      // use cast because you can't create generic arrays
      return (E[]) set.toArray();
    }
    

    【讨论】:

    • 这是一种不错的、聪明的方法,无需任何循环(在您的代码中)。当然,addAll() 方法将为您完成所有这些工作,而且可能更有效,因为它可以与 HashSet 的内部实现一起使用。
    【解决方案3】:

    您可以创建另一个临时数组,循环遍历原始数组,然后检查每个元素的值是否已经在临时数组中。如果没有,请添加。

    你也可以使用Set并覆盖equals和hashCode方法

    【讨论】:

    • 只需使用Set&lt;Cat&gt;(特别是HashSet&lt;Cat&gt;),并实现Comparable 或提供Comparator
    • 不,它不应该实现 Comparable。对于 Set 和 Map,你必须重写 equals 和 hashCode 方法
    【解决方案4】:

    这里有一个快速的技巧来做你想做的事(希望也能编译):

    // Assuming the code in the question is here.
    
    java.util.List<cat> tmp = new java.util.LinkedList<cat>();
    java.util.HashSet<String> set = new HashSet<String>();
    
    for (int i = 0; i < c.length; ++i)
      if (set.put(c[i].data)) tmp.add(c[i]);
    
    c = tmp.toArray(c);
    

    【讨论】:

    • 由于某种原因,所有的泛型都被评论系统从我的回答中删除了。哦,好吧。
    • 对于代码sn-p,缩进4个空格。编辑器有一个按钮,只需突出显示您的代码并单击即可。
    猜你喜欢
    • 2016-03-12
    • 2017-04-10
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多