2012-04-15 15 views

回答

5

您可以使用List [特别的ArrayList]举行的元素,并使用Collections.sort()你完成填充它的时候排序。

有时PriorityQueue也是一个不错的选择 - 如果你真正需要的是保持集合中最小/最大的元素。

如果你想维护一个排序后的集合 - 一个SortedBag [来自apache commons collections]可能是你在做什么。你可以从here下载一个jar并将它添加到你的类路径中,然后使用它!请注意,apache产品是非常常用的,因此经常测试!

+0

如果我想让它一直排序? – 2012-04-15 21:43:02

+0

@OfekRon:看看编辑[最后一句] - SortedBag可能就是你以后的样子。 – amit 2012-04-15 21:45:43

+0

它似乎正是我所需要的,但我的eclipse似乎没有找到它... – 2012-04-15 21:48:22

0

A 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) { ... } 
} 
+0

恕我直言,这是不是一个好方法,因为它是反对'Set'的概念。你自己指定'定义不允许重复' – Cratylus 2012-04-15 21:48:57

+0

我同意这不是最好的,但我的印象是海报想要扩展他的TreeSet。 SortedBag否则听起来像是一个很好的解决方案,但它不在标准的API中。 – 2012-04-15 21:52:46

0

此外有序List你仍然可以使用TreeSet但额外的空间。

I.e.为任何重复项目保留一个计数器,您可以尝试在TreeSet中添加。
这种方法可以直接通过TreeMap来实现,以保持每个事件的计数器。

这样你总是知道用户提供了多少重复项(计数器保持记录,而TreeSet只保存了值本身)。
它有额外的空间开销,但与有序的List你会有保留排序/删除等的开销
取决于您的需求。

+0

@downvoter:请评论。否则有什么意义? – Cratylus 2012-04-15 21:49:42

+0

没有理由为此倒退,我得到了一个似乎随机的理由。该解决方案的一个改进建议是使用“TreeMap ”,并将该地图保持为直方图。无论如何,+1。 – amit 2012-04-15 21:57:31

+0

@amit:是''TreeMap'将是一个不错的选择(tbh我总是忘记'TreeMap') – Cratylus 2012-04-15 21:59:12

0

您可以使用TreeMap。在地图中,您存储了{key,value}对,而关键字是您的对象,值是集合中关键字的出现次数,例如,您有关键“Bob”3次,因此相应的地图条目将为{“Bob “,3}。这样可以节省空间并实现保持对象排序的目标。只要确保您的密钥具有tge equals和hashcode方法就可以实现。如果yiur键没有自然顺序(比如字符串),那么你也必须实现thm的Comparable接口。

祝你好运!

+0

当你自己实施现有解决方案时,许多事情可能会出错。当有现成的,经过充分测试的解决方案时,没有理由重新发明车轮。 – amit 2012-04-15 22:03:41

+0

我无法找到您的评论和我的答案之间的相关性。什么轮子在这里重新创造?我相信这对我来说是一个回报,可以降低您的答案...;) – aviad 2012-04-15 22:06:57

+0

没有任何回报,您对我的回答的评论让我意识到您的回答,我赞同这一点。在阅读它时,我在回答评论中回答你的问题时出现了同样的情况 - 我不同意你应该使用所有工具实现一切的方法,而不是扩展你的工具箱 - 这就是我所说的“重塑轮子“[ps我没有downvote你的答案 - 所以没有报复涉及。] – amit 2012-04-15 22:10:19

3

您可以使用SortedMultiset来实现此目的。它包含在谷歌的番石榴库,你可以下载:http://code.google.com/p/guava-libraries/

如果您使用的是Eclipse,你需要番石榴的.jar文件添加到项目的类路径中(右键单击项目,选择属性,然后Java构建路径,最后在库选项卡中添加JAR)。

如果你不想在你的项目中使用第三方库,这取决于你的具体使用情况什么是最好的选择。

+1

+1使用现有的工具。我个人更喜欢apache-commons,但这只是一个品味问题:) – amit 2012-04-15 22:11:22

+0

@amit谢谢,我也喜欢你的解决方案。我遇到了与问题作者相同的问题,并正在寻找解决方案。我最终尝试了番石榴,因为Apache Commons SortedBag不是通用的。 (最后,我使用了一个列表并在插入后排序,因为性能没有问题。) – 2012-04-15 22:43:24

+1

请注意,这仅在元素真* *重复时才有用,而不是仅由比较器进行排序,而比较器会将其中的一些“ “。 – 2012-04-16 18:38:23

相关问题