TreeSet使用相同的Comprator值删除不同的项目。我不希望它被删除。 有没有办法控制这个?或者使用另一个容器类?
添加了: 好。好像我不能用Set。 出于性能考虑,我需要插入排序功能。 Can List可以这样做吗?谢谢大家。
答案 0 :(得分:10)
按定义设置的集不能有重复的条目。
所以你需要使用List或Array等
答案 1 :(得分:5)
即使它是一个集合,这仍然令人困惑,因为对象是不同的。例如,Set<E>
个不同的对象E
会在根据所使用的TreeSet<E>
转换为Comparator<E>
时删除某些对象。在这两种情况下,它都是一个集合,但存储的元素集将是不同的。在我看来,这在文档中并未得到很好的澄清。
一个简单的解决方案,如果您可以更改比较器,则不要返回0.例如,而不是:
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
使用:
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? -1: 1;
}
答案 2 :(得分:4)
Set
的主要目的是不有重复项。
您要么不想要Set
,要么需要不同的Comparator
。
答案 3 :(得分:3)
答案 4 :(得分:1)
如果你想要一个SortedList,你可以拿一个列表并在每次插入后手动调用Collections.sort()。
或者你包裹,例如一个ArrayList,以确保为您调用排序:
class SortedArrayList extends ArrayList<String> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void add(int index, String element) {
super.add(index, element);
Collections.sort(this);
}
@Override
public boolean add(String element) {
boolean returnValue = super.add(element);
Collections.sort(this);
return returnValue;
}
@Override
public boolean addAll(Collection<? extends String> c) {
boolean returnValue = super.addAll(c);
Collections.sort(this);
return returnValue;
}
@Override
public boolean addAll(int index, Collection<? extends String> c) {
boolean returnValue = super.addAll(index, c);
Collections.sort(this);
return returnValue;
}
@Override
public String set(int index, String element) {
String returnValue = super.set(index, element);
Collections.sort(this);
return returnValue;
}
}
我希望我得到所有需要排序的功能。 (删除不需要覆盖)