用于存储可能相等元素的集合排序?

时间:2012-04-15 21:39:20

标签: java sorting collections

我尝试使用TreeSet但它禁止双打是否有办法改变它?如果没有办法,我应该用什么来存储(等于和不等于)元素排序?

5 个答案:

答案 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接口。

祝你好运!