java树集-don';不要删除重复的项目
TreeSet删除具有相同压缩程序值的不同项。我不想把它拿走。 有没有办法控制这一切?或者使用另一个容器类 增加: 好啊看来我不能用Set了。 出于性能考虑,我需要插入排序功能。你能做到这一点吗?谢谢大家。请引用以下内容: 不包含重复元素的集合 使用的任何衍生工具。A的主要目的是避免重复。java树集-don';不要删除重复的项目,java,comparator,treeset,Java,Comparator,Treeset,TreeSet删除具有相同压缩程序值的不同项。我不想把它拿走。 有没有办法控制这一切?或者使用另一个容器类 增加: 好啊看来我不能用Set了。 出于性能考虑,我需要插入排序功能。你能做到这一点吗?谢谢大家。请引用以下内容: 不包含重复元素的集合 使用的任何衍生工具。A的主要目的是避免重复。 您可能不需要集合,或者需要不同的比较器集合定义不能有重复的条目 因此,您需要使用列表或数组等如果您想要一个SortedList,例如,您可以获取一个列表并在每次插入后手动调用Collections.sort(
您可能不需要
集合
,或者需要不同的比较器
集合定义不能有重复的条目
因此,您需要使用列表或数组等如果您想要一个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;
}
}
class SorterDarrayList扩展了ArrayList{
/**
*
*/
私有静态最终长serialVersionUID=1L;
@凌驾
公共void添加(int索引、字符串元素){
super.add(索引、元素);
集合。排序(this);
}
@凌驾
公共布尔添加(字符串元素){
布尔返回值=super.add(元素);
集合。排序(this);
返回值;
}
@凌驾
公共布尔加法(Collection即使它是一个集合,这仍然是令人困惑的,因为对象是不同的。例如,不同对象的集合E
在基于所使用的比较器
转换为树集时会丢弃一些对象。在这两种情况下,它都是一个集合,但存储的元素集将不同。在我的这一观点在文件中没有得到很好的澄清
一个简单的解决方案是,如果您可以更改比较器,则让它不返回0。例如,而不是:
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
使用:
public int比较(整数o1,整数o2){
返回值o1
使用不返回0的比较器。@Peter Lawrey,除了在某种意义上相同的对象之外。@Tom Hawtin同意,当对象是=
时,可以返回0,否则比较系统。identityHashCode()
或只返回任意的1
,用于具有相同内容但不是相同对象的对象。@Petery LawreySystem.identityHashCode
不是唯一的。因此您仍然需要一个平局断路器(可能使用WeakReference
s)。谢谢。但是,在插入项时,是否有支持排序的列表派生项?您始终可以使用Collections.sort(…)和原始比较器对列表进行排序。或者,您可以使用两个集合,一个集合包含元素,另一个集合包含其外观计数,即这里的multisetTry PriorityQueue或这里的MinMaxPriorityQueue
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? -1: 1;
}