【问题标题】:Remove duplicate element from set while insertion based on a criteria根据条件插入时从集合中删除重复元素
【发布时间】:2013-03-05 20:57:20
【问题描述】:

对于 ClassA 类,我有 2 个属性 - X 和 Y 我已经覆盖了 ClassA 的 equals 方法,以便通过检查属性 X 找到 2 个类的相等性。

ClassA {

Integer X,Y;

Integer getX(){return X;}
Integer getY(){return Y;}

boolean equals(object o){
      return getX().equals((ClassA)o).getX());
}

}

现在我想从 List 中删除 ClassA 的所有重复元素 但是,如果发现 2 个元素重复,我想添加一个逻辑来根据 Y 标准删除重复的元素。 所以基本上它如下所示

if(A.eqauls(B)){
  remove A , if A.getY() > B.getY()
  ore remove B , if A.getY() < B.getY()
}

显然我会尝试对列表进行排序并查看相邻的重复元素,然后根据我们的逻辑删除重复项。 我想知道我是否可以使用集合来做到这一点。

【问题讨论】:

    标签: java set duplicates


    【解决方案1】:

    类似这样的:

    Map<ClassA, ClassA> map = new HashMap();
    
    for(ClassA elem : yourList)
    {
       ClassA existing = map.get(elem);
       if(existing != null)
       {
          if(check your condition using "elem" and "existing" and getY)
          {
            continue;// don't replace the element in the map.
          }
       }
       map.put(elem, elem);
    }
    //map.values() will have your elements
    

    如果您想保留列表中元素的顺序,也可以使用LinkedHashMap

    顺便说一句,HashSet 是使用 HashMap 以类似的方式实现的。

    【讨论】:

      【解决方案2】:

      集合使用equals() 方法来确定元素是否已经在集合中。换句话说,如果你只是使用正常的插入,第一个插入到集合中的将是你被卡住的那个。

      我认为您不能覆盖此行为(除非您实现自己的 set 类,在其中更改 add 方法以测试相等性也进行 Y 比较)。

      【讨论】:

        【解决方案3】:

        如果不违反Set 的一般约定,您将无法执行此操作,该约定指出add() 永远不会添加一个相等的元素(根据equals() 方法)到集合中已经存在的元素.显然,如果您正在实现此行为,您可以使用Set(您可以检查您是否已经看到具有特定X 值的元素)。不过,Map 会是更好的选择。

        由于该行为很容易通过对列表进行排序和循环来实现,所以我会使用它。使用 Set 不会在实现时间和可维护性方面获得任何好处(可以说您使代码更难阅读),因此它确实是一个更好的选择。

        【讨论】:

          猜你喜欢
          • 2016-10-14
          • 2017-08-29
          • 2012-04-01
          • 2021-08-18
          • 2017-08-31
          • 1970-01-01
          • 2021-02-14
          • 2020-12-13
          相关资源
          最近更新 更多