我不确定为什么人们在这里被否决。
你绝对想要一套。您的要求不仅满足“集合”的定义和功能,而且集合实现旨在通过散列或比较身份快速识别重复项。
假设您有一个 List 实现,它带有一个委托和一个谓词:
List uniquePeople = new PredicatedList(new ArrayList(),UnqiuePersonPredicate.getInstance())
public class PredicatedList<T> implements List<T> {
private List<T> delegate = null;
private Predicate<T> predicate;
public PredicatedList<List<T> delegate, Predicate p) {
this.delegate = delegate;
this.predicate = p;
}
// implement list methods here and apply 'p' before calling your insertion functions
public boolean add(Person p) {
if(predicate.apply(p))
delegate.add(p);
}
}
为此,您需要有一个谓词来遍历列表以找到相等的元素。这是一个 O(N) 操作。如果你使用 HashSet,那么它是 O(1) < n < O(N)。您的摊销身份检查是负载因子 * N。而且,通常更接近 O(1)
如果您使用 TreeSet,您将得到 O(log(n)),因为元素按身份排序,并且您只需要 log(n) 时间进行二分搜索。
根据“名称”或您想要的任何内容定义 hashCode()/equals 并使用 HashSet 或使用 TreeSet 并定义 Comparable/Comparator
如果您的返回类型必须是列表,则执行以下操作: Set uniquePeople = new HashSet(); uniquePeople.add(...);
列出人员 = new LinkedList(uniquePeople);