【发布时间】:2012-04-15 21:39:20
【问题描述】:
我尝试使用 TreeSet 但它不允许双打有没有办法改变它?如果没有办法,我应该用什么来存储(相等和不相等)排序的元素?
【问题讨论】:
标签: java sorting collections
我尝试使用 TreeSet 但它不允许双打有没有办法改变它?如果没有办法,我应该用什么来存储(相等和不相等)排序的元素?
【问题讨论】:
标签: java sorting collections
您可以使用List [特别是ArrayList] 来保存元素,并在完成填充后使用Collections.sort() 对其进行排序。
有时PriorityQueue 也是一个不错的选择 - 如果您真正需要的是维护集合中最小/最大的元素。
如果您想维护一个排序的集合 - SortedBag [来自 apache commons 集合] 可能就是您所追求的。您可以从here 下载一个 jar 并将其添加到您的类路径中,然后就可以使用它了!请注意,apache 产品非常常用,因此经常进行测试!
【讨论】:
您可以为此使用SortedMultiset。它包含在 Google 的 Guava 库中,您可以在以下位置下载:http://code.google.com/p/guava-libraries/
如果你使用的是 Eclipse,你需要将 Guava 的 .jar 文件添加到项目的类路径中(右键单击项目,选择属性,然后选择 Java 构建路径,最后在库选项卡中添加 JAR)。
如果您不想在项目中使用第三方库,这取决于您的具体用例,最佳选择是什么。
【讨论】:
根据定义,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
您可以使用 TreeMap。在映射中,您存储 {key,value} 对,而键是您的对象,值是您的集合中键的出现次数,例如您有 3 次键“Bob”,因此相应的映射条目将是 {"Bob ", 3} .通过这种方式,您可以节省空间并实现保持对象分类的目标。只需确保您的密钥实现了 tge equals 和 hashcode 方法。如果 yiur 键没有可用的自然顺序(例如字符串),您还必须为 thm 实现 Comparable 接口。
祝你好运!
【讨论】:
除了有序的List,您仍然可以使用TreeSet,但需要额外的空间。
即为您尝试在TreeSet 中添加的任何重复项目保留一个计数器。
这种方法可以通过TreeMap 直接实现,以保留每个发生的计数器。
通过这种方式,您始终可以知道用户提供了多少重复项(计数器保持记录,而 TreeSet 只保存值本身)。
它有额外的空间开销,但使用有序的List,您将有保留添加/删除等排序的开销。
取决于你的需要。
【讨论】:
TreeMap<T,Integer>,并将地图维护为直方图。无论如何,+1。
TreeMap 将是一个不错的选择(我总是忘记TreeMap)
SortedMultiset。你可能不想这样做。 (不,我不是反对者,也不知道那个人的原因。)