我试过使用TreeSet,但它不允许双打有没有办法改变?如果没有办法,我应该用什么来存储(相等和不相等)元素排序?用于存储可能相等的元素排序的集合?
回答
您可以使用List
[特别的ArrayList
]举行的元素,并使用Collections.sort()
你完成填充它的时候排序。
有时PriorityQueue
也是一个不错的选择 - 如果你真正需要的是保持集合中最小/最大的元素。
如果你想维护一个排序后的集合 - 一个SortedBag
[来自apache commons collections]可能是你在做什么。你可以从here下载一个jar并将它添加到你的类路径中,然后使用它!请注意,apache产品是非常常用的,因此经常测试!
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) { ... }
}
恕我直言,这是不是一个好方法,因为它是反对'Set'的概念。你自己指定'定义不允许重复' – Cratylus 2012-04-15 21:48:57
我同意这不是最好的,但我的印象是海报想要扩展他的TreeSet。 SortedBag否则听起来像是一个很好的解决方案,但它不在标准的API中。 – 2012-04-15 21:52:46
此外有序List
你仍然可以使用TreeSet
但额外的空间。
I.e.为任何重复项目保留一个计数器,您可以尝试在TreeSet
中添加。
这种方法可以直接通过TreeMap
来实现,以保持每个事件的计数器。
这样你总是知道用户提供了多少重复项(计数器保持记录,而TreeSet只保存了值本身)。
它有额外的空间开销,但与有序的List
你会有保留排序/删除等的开销
取决于您的需求。
您可以使用TreeMap。在地图中,您存储了{key,value}对,而关键字是您的对象,值是集合中关键字的出现次数,例如,您有关键“Bob”3次,因此相应的地图条目将为{“Bob “,3}。这样可以节省空间并实现保持对象排序的目标。只要确保您的密钥具有tge equals和hashcode方法就可以实现。如果yiur键没有自然顺序(比如字符串),那么你也必须实现thm的Comparable接口。
祝你好运!
当你自己实施现有解决方案时,许多事情可能会出错。当有现成的,经过充分测试的解决方案时,没有理由重新发明车轮。 – amit 2012-04-15 22:03:41
我无法找到您的评论和我的答案之间的相关性。什么轮子在这里重新创造?我相信这对我来说是一个回报,可以降低您的答案...;) – aviad 2012-04-15 22:06:57
没有任何回报,您对我的回答的评论让我意识到您的回答,我赞同这一点。在阅读它时,我在回答评论中回答你的问题时出现了同样的情况 - 我不同意你应该使用所有工具实现一切的方法,而不是扩展你的工具箱 - 这就是我所说的“重塑轮子“[ps我没有downvote你的答案 - 所以没有报复涉及。] – amit 2012-04-15 22:10:19
您可以使用SortedMultiset来实现此目的。它包含在谷歌的番石榴库,你可以下载:http://code.google.com/p/guava-libraries/
如果您使用的是Eclipse,你需要番石榴的.jar文件添加到项目的类路径中(右键单击项目,选择属性,然后Java构建路径,最后在库选项卡中添加JAR)。
如果你不想在你的项目中使用第三方库,这取决于你的具体使用情况什么是最好的选择。
+1使用现有的工具。我个人更喜欢apache-commons,但这只是一个品味问题:) – amit 2012-04-15 22:11:22
@amit谢谢,我也喜欢你的解决方案。我遇到了与问题作者相同的问题,并正在寻找解决方案。我最终尝试了番石榴,因为Apache Commons SortedBag不是通用的。 (最后,我使用了一个列表并在插入后排序,因为性能没有问题。) – 2012-04-15 22:43:24
请注意,这仅在元素真* *重复时才有用,而不是仅由比较器进行排序,而比较器会将其中的一些“ “。 – 2012-04-16 18:38:23
- 1. 不能排除可排序的元素
- 2. C#集合 - 按元素排序(旋转)
- 3. 将元素存储在具有两个可能索引的集合中
- 4. 遍历集合中的元组中的排序元素
- 5. 检查元素集合存在于多线程应用程序
- 6. 什么是适合存储少量元素的集合类型?
- 7. 休眠检查集合中的所有元素相等
- 8. CodeFluent相关集合排序
- 9. 如何排序与列表集合中的元素相关的字典C#
- 10. 用linq排序可观察的集合
- 11. 更改集合中的元素会改变'等于'语义
- 12. Javascript数组排序不正确时,许多相等的元素
- 13. (C++)添加随机性快速排序上相等的元素
- 14. 从Arrays.asList创建的存储重复元素的集合
- 15. 排序使用jQuery存储在变量中的Div元素
- 16. 包含元素和其他集合用于构造C++的集合的集合
- 17. 更改STL多重集中两个相等元素的顺序
- 18. 基于从redis排序的集合排序Django查询集
- 19. 合并排序:使用混合元素排序列表
- 20. 使用引用相等的集合
- 21. 更改元素等于在快速排序中的枢轴
- 22. 集合元素的组合
- 23. 按第一个元素对元素列表排序,但如果按第二个元素排序则等于
- 24. 排序的集合
- 25. 将列表中的唯一元素排序到集合
- 26. 排序元组可能存在或不
- 27. SubArray中的相等元素
- 28. 为集合隐式定义相等/排序
- 29. jTemplates foreach保存集合的排序吗?
- 30. 是std :: find仅适用于其元素可能未被排序的容器?
如果我想让它一直排序? – 2012-04-15 21:43:02
@OfekRon:看看编辑[最后一句] - SortedBag可能就是你以后的样子。 – amit 2012-04-15 21:45:43
它似乎正是我所需要的,但我的eclipse似乎没有找到它... – 2012-04-15 21:48:22