如何按字母顺序对哈希表中的元素进行排序?

div*_*ivz 1 java sorting map

如何按字母顺序对哈希表元素进行排序?例如,我的元素是:

cijfercode, Zweeds, Doorloper, Kruizword, Crypto, Woordzoker
Run Code Online (Sandbox Code Playgroud)

编辑:我也有一个排序哈希表元素的解决方案.这是解决方案:

java.util.Vector vec = new java.util.Vector(hashtableList.keySet());
Collections.sort(vec);
Run Code Online (Sandbox Code Playgroud)

Mar*_*iot 9

如果这些"元素"是,则可以将它们存储在a中TreeMap,这将根据键的自然顺序生成一致的顺序.请注意,除了创建一个旧地图传递给构造函数之外,您不需要做太多工作:

Map<String,?> map = ?
Map<String,?> orderedMap = new TreeMap<String,?>(map);
Run Code Online (Sandbox Code Playgroud)

然后,像正常一样迭代:

for(String key : orderedMap.keys()){

}
Run Code Online (Sandbox Code Playgroud)

如果您的"元素"是,那么您可以将它们作为键插入到TreeMap原始键的跟踪中,像以前一样读取值的排序顺序(基本上创建反向索引):

Map<?,String> map = ?
Map<String,List<?>> orderedVals = new TreeMap<String,List<?>>();
for(Entry<?,String> map : map.entrySet()){
    List<?> keys = orderedVals.get(map.getValue());
    if(keys == null){
        keys = new ArrayList<?>();
        orderedVals.put(map.getValue(), keys);
    }
    keys.add(map.getKey());
}

// now orderedVals has keys in sorted order
for(String val : orderedVals.keys()){

}
Run Code Online (Sandbox Code Playgroud)

当然,如果你实际上没有使用任何与事实有关的事实,这些东西都在"哈希表"中(我将其视为实现的东西Map),那么你可以加载List你选择的一个,然后对它进行排序:

List<String> list = new ArrayList<String>(map.values()); // or use map.keys()
Collections.sort(list);
Run Code Online (Sandbox Code Playgroud)

如果您对默认排序顺序不满意String,请随意编写自己的比较器:

Collections.sort(list, new Comparator<String>(){
    public int compare(String left, String right){
        return // your impl
    }
});
Run Code Online (Sandbox Code Playgroud)

compare必须在第left一个时返回一个负整数,如果leftright是相同则返回0,如果是第一个则返回一个正整数right.


Chr*_*ung 5

Mark Elliot的想法是正确的.我不喜欢整个Map<?, List<?>>想法; 我对番石榴太过宠坏了.所以这是一个相同想法的番石榴版本:

SortedSetMultimap<String, ?> sorted = Multimaps.invertFrom(
        Multimaps.forMap(map), TreeMultimap.create());
for (Map.Entry<String, ?> entry : sorted.entries()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这就像Mark的代码大小的三分之一.:-)

  • 所以,公平地说,番石榴是至少100KB包含的,我的代码填充在某处,因为`invertMap`是321B,或大约3*数量级*更简洁:),+ 1,这更具可读性. (2认同)