【问题标题】:Collection for storing potentially equal elements sorted?用于存储排序的潜在相等元素的集合?
【发布时间】:2012-04-15 21:39:20
【问题描述】:

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

【问题讨论】:

    标签: java sorting collections


    【解决方案1】:

    您可以使用List [特别是ArrayList] 来保存元素,并在完成填充后使用Collections.sort() 对其进行排序。

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

    如果您想维护一个排序的集合 - SortedBag [来自 apache commons 集合] 可能就是您所追求的。您可以从here 下载一个 jar 并将其添加到您的类路径中,然后就可以使用它了!请注意,apache 产品非常常用,因此经常进行测试!

    【讨论】:

    • 如果我想让它一直排序?
    • @OfekRon:看看编辑[最后一句话] - SortedBag 可能就是你想要的。
    • 它似乎正是我需要的,但我的 eclipse 似乎没有找到它......
    • @OfekRon:apache commons 是一个开源项目,虽然被广泛使用,但并不是官方的 java 库。您可以从here 下载一个 jar 并将其添加到您的类路径中,然后就可以使用它了!熟悉 apache-commons 可能是个好主意,因为那里已经实现了一些常用的常用功能!
    • @aviad:没有难过的感觉,我只是不同意。一切都可以用assembly 完成,也可以用turing-machine 完成。我们更喜欢使用现有解决方案而不是从头开始实施它们是有原因的。我总是更喜欢使用维护良好、经过良好测试、现有、免费和安全的解决方案 - 而不是我自己实施它。
    【解决方案2】:

    您可以为此使用SortedMultiset。它包含在 Google 的 Guava 库中,您可以在以下位置下载:http://code.google.com/p/guava-libraries/

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

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

    【讨论】:

    • +1 用于使用现有工具。我个人更喜欢 apache-commons,但这只是个人喜好问题 :)
    • @amit 谢谢,我也喜欢你的解决方案。我面临与问题作者相同的问题,正在寻找解决方案。最后我尝试了 Guava,因为 Apache Commons SortedBag 不是通用的。 (最后我使用了一个 List 并在插入后排序,因为性能没有问题。)
    • 请注意,这仅在元素真正重复时才有用,而不是简单地由认为其中一些“并列”的比较器进行排序。
    【解决方案3】:

    根据定义,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 的概念。您自己指定 by definition doesn't allow duplicates
    • 我同意这不是最好的,但我的印象是发布者只想扩展他的 TreeSet。 SortedBag 听起来像是一个不错的解决方案,但它不在标准 API 中。
    【解决方案4】:

    您可以使用 TreeMap。在映射中,您存储 {key,value} 对,而键是您的对象,值是您的集合中键的出现次数,例如您有 3 次键“Bob”,因此相应的映射条目将是 {"Bob ", 3} .通过这种方式,您可以节省空间并实现保持对象分类的目标。只需确保您的密钥实现了 tge equals 和 hashcode 方法。如果 yiur 键没有可用的自然顺序(例如字符串),您还必须为 thm 实现 Comparable 接口。

    祝你好运!

    【讨论】:

    • 当您自己实施现有解决方案时,很多事情都可能出错。当现有的、经过良好测试的解决方案存在时,没有理由重新发明轮子。
    • 我找不到您的评论和我的回答之间的相关性。这里重新发明了什么轮子?我相信这对我投反对票是一种回报……;)
    • 没有回报,您对我的回答让我知道您的回答,我同意这一点。在阅读它时,出现了我在 cmets 中回答你的同样的问题——我不同意你应该从你拥有的工具中实现所有东西的方法,而不是扩展你的工具箱——这就是我所说的“重新发明轮子” [p.s.我没有否决你的回答 - 所以不涉及报复。]
    • 当我需要一个包含 2 个字符串(名字和姓氏)的类时,我会创建一个包含 2 个字符串成员的类,而不是寻找一个开箱即用的库编程是关于。我同意,当任务变得复杂时,请寻找现有的解决方案,但在这种特殊情况下,我认为问题可以很容易地解决,只需如上所述的很少的努力。
    • 好吧,我相信在这一点上我们可以就这个问题达成一致意见。逾越节快乐! [是的,我迟到了] 和独立日 [是的,我来早了]! :)
    【解决方案5】:

    除了有序的List,您仍然可以使用TreeSet,但需要额外的空间。

    即为您尝试在TreeSet 中添加的任何重复项目保留一个计数器。
    这种方法可以通过TreeMap 直接实现,以保留每个发生的计数器。

    通过这种方式,您始终可以知道用户提供了多少重复项(计数器保持记录,而 TreeSet 只保存值本身)。
    它有额外的空间开销,但使用有序的List,您将有保留添加/删除等排序的开销。
    取决于你的需要。

    【讨论】:

    • @downvoter:也请发表评论。否则有什么意义?
    • 没有理由反对这个投票,我也得到了一个看起来随机的。此解决方案的一个改进建议是使用TreeMap&lt;T,Integer&gt;,并将地图维护为直方图。无论如何,+1。
    • @amit:Yes TreeMap 将是一个不错的选择(我总是忘记TreeMap
    • 你们正在重塑SortedMultiset。你可能不想这样做。 (不,我不是反对者,也不知道那个人的原因。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多