我尝试使用TreeSet但它禁止双打是否有办法改变它?如果没有办法,我应该用什么来存储(等于和不等于)元素排序?
答案 0 :(得分:5)
您可以使用List
[特别是ArrayList
]来保存元素,并在完成填充后使用 Collections.sort()
对其进行排序。
有时PriorityQueue
也是一个不错的选择 - 如果您真正需要的是维护集合中最小/最大的元素。
如果您想维护已排序的集合 - SortedBag
[来自apache commons集合]可能就是您所追求的。您可以从here下载jar并将其添加到类路径中,然后使用它!请注意,apache产品非常常用,因此经常进行测试!
答案 1 :(得分:3)
您可以使用SortedMultiset来实现此目的。它包含在Google的Guava库中,您可以在http://code.google.com/p/guava-libraries/
下载如果您正在使用Eclipse,则需要将Guava的.jar文件添加到项目的类路径中(右键单击项目,选择属性,然后选择Java Build Path,最后在库选项卡中添加JAR)。
如果您不想在项目中使用第三方库,则取决于您的具体用例,最佳选择是什么。
答案 2 :(得分:0)
根据定义,Set
不允许重复。
您需要使用其他Comparator
,或者您可以使用任何类型的List
。
SortedSet<String> temp = new TreeSet<String>(new MyComparator());
其中MyComparator
实现Comparator
:
public class MyComparator implements Comparator<String> {
public int compare(String a, String b) { ... }
}
答案 3 :(得分:0)
除了有序的List
之外,您仍然可以使用TreeSet
,但需要额外的空间。
即。为您尝试在TreeSet
中添加的任何重复项目保留一个计数器
这种方法可以通过TreeMap
直接实现,以保持每个发生的计数器。
这样你总能知道用户提供了多少重复项(计数器保留记录,而TreeSet只保存值本身)。
它有额外的空间开销,但是对于有序的List
,您将有额外的保留添加/删除等顺序的开销。
取决于您的需求。
答案 4 :(得分:0)
您可以使用TreeMap。在地图中,您存储{key,value}对,而密钥是您的对象,值是您集合中密钥的出现次数,例如,您有3次密钥“Bob”,因此相应的地图条目将是{“Bob” “,3}。这样可以节省空间并实现保持对象排序的目标。只需确保您的密钥具有tge equals和hashcode方法。如果没有自然顺序可用于yiur键(比如字符串),你还必须为thm实现Comparable接口。
祝你好运!