使用相同类型的对象替换列表中的对象,但不一定相等

时间:2013-10-24 17:57:56

标签: java data-structures

使用相同类型的对象替换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")

3 个答案:

答案 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,我想你会得到你想要的行为。