【发布时间】:2011-08-24 00:57:24
【问题描述】:
我有一个带有字母数字值的HashTable。我想对它们排序。
我怎样才能实现它?
【问题讨论】:
-
欢迎使用 StackOverflow! 请尽量使您的问题标题尽可能简短/富有表现力。此外,帮助他人理解您的意思。谢谢! ;-)
标签: java sorting collections hashtable
我有一个带有字母数字值的HashTable。我想对它们排序。
我怎样才能实现它?
【问题讨论】:
标签: java sorting collections hashtable
第一个问题 - 你的意思是对值进行排序,还是对键进行排序?
如果您只想按顺序访问排序后的值,最好的方法是创建一个列表或数组,然后排序。
对于值:Arrays.sort(table.values().toArray()) 或 Collections.sort(new ArrayList(table.values()))
对于密钥:Arrays.sort(table.keySet().toArray()) 或 Collections.sort(new ArrayList(table.keySet()))
有关这些排序方法的更多信息:Arrays.sort() 或 Collections.sort()。
如果你想重复使用基于排序的键,你最好使用TreeMap。
如果您反复想根据排序值(而不是键)进行访问,那么您总是可以按顺序插入到 LinkedHashMap 中,这将保持顺序。
【讨论】:
如果您不想创建一个新类来保存键/值关系并且您对 TreeMap 不感兴趣,那么类似以下的方法也可以:
ArrayList<Entry<String,String>> list = new ArrayList<Entry<String,String>>();
list.addAll(map.entrySet());
Collections.sort(list, new Comparator<Entry<String,String>>() {
@Override
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
//your logic here;
}
});
【讨论】:
为什么?您可能选择了 HashTable 而不是 TreeMap,因为它具有更好的性能(并且没有排序)。如果您不想要性能而想要排序,请使用 TreeMap。
【讨论】:
HashTable 不保留订单。
所以最好用它创建一个List 并对其进行排序。
您需要将您的类型包装到一个类中,然后实现一个比较所有类型的值(在您的术语中)的 Comparator,
class Foo implements Comparator<Foo>{
private int no;
private String alpha;
//+getter/setters
public int compare(Foo f1, Foo f2){
//put your logic here
}
}
【讨论】: