如何在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
个对象,但我怎么能确定?如果上面的代码是正确的,那么一个好的答案就可以解释原因。如果还需要做其他事情,那么一个好的答案将解释还有什么需要做。
答案 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
将包含唯一对象。