使用相同类型的对象替换List
中的对象的最简洁方法是什么,但不一定相等。基本上我想要添加对象时Set
的行为,但是基于Type而不是相等。 (编辑)我还需要保留插入顺序。
我不一定要使用List
任何其他数据结构就足够了。我需要的是这种行为:
interface A<T> {
T getData();
}
class B implements A<String> {
private final String data;
public B(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
class C implements A<String> {
private final String data;
public C(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
Set<A> set = new SomeSet<A>();
set.add(new B("one"));
set.add(new C("two"));
set.add(new C("three"));
Set
应包含2个元素,new B("one")
和new C("three")
。
答案 0 :(得分:3)
我认为TreeSet非常适合这种情况。它的排序方式与List
相同。 This constructor允许您传递Comparator
。您可以比较类型,如果它们相等,则Set中只存在一个。
答案 1 :(得分:1)
如果您使用除重写的add()方法之外的任何内容来添加元素,这将会中断,但这是一个快速演示。理想情况下,您将包装一个ArrayList,并且只显示一个add方法。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class TypeUniqueCollection extends ArrayList<Object> {
private int classCount = 0;
private Map<Class<?>, Integer> classesSeenOrder = new HashMap<Class<?>, Integer>();
@Override
public boolean add(Object o) {
Class<?> c = o.getClass();
Integer index = classesSeenOrder.get(c);
if (index != null) {
super.set(index, o);
}
else {
classesSeenOrder.put(c, classCount++);
super.add(o);
}
return true;
}
}
答案 2 :(得分:0)
假设O(n)性能对你来说不是问题,也许你应该扩展Vector,如下所示:
public class SetVector extends Vector {
// override the add() function
public boolean add(E e) {
int position = indexOf(e);
if (position == -1)
return super.add(e);
set(position, e);
}
}
现在只是实例化SetVector,我想你会得到你想要的行为。