1

用相同类型的对象替换 aList中的对象的最简洁方法是什么,但不一定相等。基本上我想要Set添加对象时的行为,但基于类型而不是相等。(编辑)我还需要保留插入顺序。

我不一定希望使用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").

4

3 回答 3

3

我认为TreeSet非常适合这个。它像List. 这个构造函数会让你传入一个Comparator. 您可以比较类型,如果它们相等,则 Set 中只存在一个。

于 2013-10-24T18:01:11.610 回答
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;
  }
}
于 2013-10-24T18:13:06.803 回答
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,我想你会得到你想要的行为。

于 2013-10-25T00:07:02.797 回答