确保列表具有唯一值

时间:2015-05-11 23:52:44

标签: java

如何在Java中获取唯一值对的集合

我阅读了this other posting并尝试了以下代码作为Pair类对该帖子的回答:

public class Pair<L,R> {

  private final L left;
  private final R right;

  public Pair(L left, R right) {
    this.left = left;
    this.right = right;
  }

  public L getLeft() { return left; }
  public R getRight() { return right; }

  @Override
  public int hashCode() { return left.hashCode() ^ right.hashCode(); }

  @Override
  public boolean equals(Object o) {
    if (!(o instanceof Pair)) return false;
    Pair pairo = (Pair) o;
    return this.left.equals(pairo.getLeft()) &&
           this.right.equals(pairo.getRight());
  }

}

但是如何确保Pair个对象的集合仅使用left类包含right + Pair的唯一组合?

这是我的第一次尝试:

            sel_person = this.serviceLayer.findSelPerson(patntId);
            ArrayList<Pair> ps = new ArrayList<Pair>();
            for(int ee=0;ee<sel_person.getRoles().size();ee++){
                Pair p1 = new Pair(sel_person.getRoles().get(ee).getId1Root(), sel_person.getRoles().get(ee).getId1Extension());
                ps.add(p1);
                Pair p2 = new Pair(sel_person.getRoles().get(ee).getId2Root(), sel_person.getRoles().get(ee).getId2Extension());
                ps.add(p2);
            }

我担心ArrayList无法关注left + right的冗余组合。我想知道hashcode方法是否会以某种方式阻止使用Pair + right`的冗余组合来实例化left个对象,但我怎么能确定?如果上面的代码是正确的,那么一个好的答案就可以解释原因。如果还需要做其他事情,那么一个好的答案将解释还有什么需要做。

2 个答案:

答案 0 :(得分:2)

  

但是如何使用Pair类确保Pair对象的集合仅包含left + right的唯一组合?

List不关心重复元素。 Set接口(例如HashSet)的实现更合适,因为Set被定义为唯一元素的集合(由hashCode定义的唯一性和{它包含的对象的{1}}。

equals

答案 1 :(得分:2)

HashSet为你做了伎俩

ArrayList<Pair> ps = new ArrayList<Pair>();
Set<Pair> set = new HashSet<Pair>(ps);
然后

set将包含唯一对象。