开发者

How do I sort elements in a hash table in alphabetical order?

开发者_运维问答How do I sort hash table elements alphabetically? For example, my elements are:

cijfercode, Zweeds, Doorloper, Kruizword, Crypto, Woordzoker

edit: I also got a solution for sorting the hashtable elements. Here is the solution:

java.util.Vector vec = new java.util.Vector(hashtableList.keySet());
Collections.sort(vec);


If these "elements" are keys you can store them in a TreeMap, which will produce a consistent order based on the natural ordering of the keys. Note you don't need to do much except create a new map with the old map passed to the constructor:

Map<String,?> map = ?
Map<String,?> orderedMap = new TreeMap<String,?>(map);

Then, iterate like normal:

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

}

If your "elements" are values, then you can insert them as keys into a TreeMap keeping track of the original keys, read the sorted order of values as before (basically creating an inverted index):

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()){

}

Of course, if you're not actually using anything related to the fact these things are in a "hashtable" (I read this as something implementing Map), then you can load up a List of your choosing, and sort it:

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

If you're not happy with the default sort order for String, feel free to write your own comparator:

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

compare must return a negative integer when the left comes first, 0 if left and right are the same, and a positive integer if right comes first.


Mark Elliot's idea is correct. I don't like the whole Map<?, List<?>> idea though; I've been far too spoilt on Guava. So here's a Guava version of the same idea:

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

This is, like, a third of the size of Mark's code. :-)


java.util.Vector vec =new java.util.Vector(hashtableList.keySet()); 
Collections.sort(vec);


Please check http://discuss.joelonsoftware.com/default.asp?joel.3.19588.13 for an interesting discussion on this.

Consider http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeMap.html too.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜