TreeSet 删除具有相同 Comprator 值的不同项目。我不希望它被删除。有没有办法控制这个?还是使用另一个容器类?
补充:好的。看来我不能使用Set。出于性能考虑,我需要插入排序功能。List可以做到这一点吗?谢谢大家。
TreeSet 删除具有相同 Comprator 值的不同项目。我不希望它被删除。有没有办法控制这个?还是使用另一个容器类?
补充:好的。看来我不能使用Set。出于性能考虑,我需要插入排序功能。List可以做到这一点吗?谢谢大家。
根据定义,集合不能有重复的条目。
所以你需要使用 List 或 Array 之类的
即使它是一个集合,这仍然令人困惑,因为对象不同。例如,一个Set<E>
不同的E
对象在转换为一个TreeSet<E>
基于Comparator<E>
使用的对象时会丢弃一些对象。在这两种情况下,它都是一个集合,但存储的元素集合会有所不同。在我看来,这在文档中没有得到很好的说明。
一个简单的解决方案,如果您可以更改 Comparator,则让它不返回 0。例如,而不是:
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
利用:
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? -1: 1;
}
a 的主要目的Set
是不重复。您要么不想要 a Set
,要么需要不同的Comparator
.
如果您想要一个 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;
}
}
我希望我得到了所有需要排序的功能。(删除不需要覆盖)