2011-07-28 3 views
1

Как отсортировать элементы хэш-таблицы по алфавиту? Например, мои элементы:Как отсортировать элементы в хеш-таблице в алфавитном порядке?

cijfercode, Zweeds, Doorloper, Kruizword, Crypto, Woordzoker 

редактировать: Я также получил решение для сортировки Хеш элементов. Вот решение:

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

ответ

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

Если эти «элементы» являются ключи вы можете хранить их в TreeMap, который будет производить последовательный порядок, основанный на естественного порядка ключей. Обратите внимание, что вам не нужно делать много, за исключением создания новой карты со старой картой передается конструктору:

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

Тогда итерация как нормальные:

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

} 

Если «элементы» являются ЗНАЧЕНИЯ, то вы можете вставить их в качестве ключей в 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()){ 

} 

Конечно, если вы на самом деле не используете что-либо, связанное с тем, что эти вещи находятся в «хэш-таблице» (я прочитал это как что-то реализующее Map), тогда вы можете загрузить List по вашему выбору и отсортировать его по:

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

Если вы не счастливы с порядком сортировки по умолчанию для String, не стесняйтесь написать свой собственный компаратор:

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

compare должен возвращать отрицательное число, когда left приходит первым, 0, если left и right - это то же самое и положительное целое число, если на первый взгляд стоит right.

+0

+1 Неплохой ответ, хотя в случае перевернутой карты я бы предпочел вместо этого использовать «SortedSetMultimap» Guava. (Я выложу запись, выражающую идею через минуту.) –

+0

actullly моя проблема в том, что я должен разбирать эти значения Cijfercode, Crypto Doorloper Kruizword Woordzoker Zweeds из xml.but в xml они находятся в алфавитном порядке, как указано выше. Но при использовании хеш-таблицы для извлечения значений она становится порядком Cijfercode, Doorloper Woordzoker Zweeds Kruizword Crypto, почему это происходит? – chinchu

+0

@chinchu: 'HashMap' не имеет никаких гарантий заказа итераций.Если вы этого хотите, у вас есть два варианта: «TreeMap» (заказ на основе натурального или на основе компаратора) и «LinkedHashMap» (порядок вставки). –

0

Просьба ознакомиться с интересной дискуссией по этому вопросу http://discuss.joelonsoftware.com/default.asp?joel.3.19588.13.

Рассмотрите также http://download.oracle.com/javase/1.4.2/docs/api/java/util/TreeMap.html.

+0

actullly моя проблема заключается в том, что я должен разбирать эти значения Cijfercode, Crypto Doorloper Kruizword Woordzoker Zweeds из xml.but, в xml они находятся в алфавитном порядке, как указано выше. Но при использовании хэш-таблицы для извлечения значений она становится порядком Cijfercode, Doorloper Woordzoker Zweeds Kruizword Crypto, почему это происходит? – chinchu

+0

Привет каждый. Я получил решение для сортировки элементов хэш-таблицы. Вот решение: java.util.Vector vec = new java.util.Vector (hashtableList.keySet()); Collections.sort (vec); – chinchu

5

Идея Марка Эллиота верна. Мне не нравится идея Map<?, List<?>>; Я был слишком испорчен на Guava. Так вот версия гуавы той же идеи:

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

Это, как, треть размера кода Марка. :-)

+2

Итак, если честно, guava, по крайней мере, включает 100 Кбайт, мой код заполняется где-то, как 'invertMap' составляет 321B, или примерно на 3 * порядка * более кратким :), +1, это гораздо более читаемо. –

+0

+1, смешно. :-)) –

+0

@ cheris thank u cheris – chinchu

Смежные вопросы