2014-02-04 2 views
1

Я ловлю себя иногда делаю это:Java: функция Utility, чтобы создать новый отсортированный список

List<String> keys = new ArrayList<String>(vii.slots.keySet()); 
Collections.sort(keys); 
for(String index : keys) { 
    ... 

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

for(String index : sorted(vii.slots.keySet())) { 
    ... 

Извините, если это FAQ, но я не смог найти это после небольшого поиска в Интернете, и я уверен, что Java-гуру ответит на это через пять секунд.

Благодаря

+1

Какой тип 'слотов'? – Reimeus

+0

@Reimeus Map - VarInfo - это класс в моем приложении. – paj28

ответ

1

гуавы-х ordering может быть то, что вы ищете:

Для Вашего использования:

for (String index : Ordering.<String>natural().sortedCopy(vii.slots.keySet())) { 
     System.out.println(index); 
} 

Упрощенная сортировка с естественным порядком будет выглядеть примерно так:

List<String> list = new ArrayList<>(); 
    list.add("pops"); 
    list.add("chops"); 
    list.add("zebra"); 
    list.add("xam"); 

    for (String str : Ordering.<String>natural().sortedCopy(list)) { 
     System.out.println(str); 
    } 

дает :

chops 
pops 
xam 
zebra 

Ordering также может работать с пользовательскими Comparator экземплярами для сортировки в требуемой последовательности.

+1

Я не вижу необходимости в guava, поскольку TreeMap или TreeSet поддерживают упорядоченные коллекции и могут быть построены в одной строке без дополнительной зависимости. –

+0

@LanceJava И я не оспариваю это, есть разные способы выполнить требование, и кроме того, OP явно упоминает «полезность» и «гуаву» в своем посте без каких-либо ограничений внешней зависимости. – PopoFibo

2
Map<String,VarInfo> sorted = new TreeMap<String,VarInfo>(vii.slots); 
for (Map.Entry<String,VarInfo> entry : sorted) { 
    doStuff(entry.getKey(), entry.getValue()); 
} 
+0

Классическая иллюстрация моего питомца: используйте подходящую коллекцию для работы! –

1

Возможно, вам нужен какой-то SortedSet вместо List. Если вам необходимо поддерживать количество вхождений каждого элемента - попробуйте использовать гуавы в TreeMultiset

Пример:

Multiset<Integer> multiSet = TreeMultiset.create(); 
multiSet.add(2); 
multiSet.add(2); 
multiSet.add(1); 
multiSet.add(5); 
multiSet.add(6); 
multiSet.add(6); 
multiSet.add(3); 
for (Integer i : multiSet) { 
    System.out.print(i); 
} 

выход будет:

1223566 
1

Опция, чтобы написать Класс Iterable, который будет отображать вашу карту и перебирать ключи; то вы получаете однострочный вызов и не нуждаетесь в anothe rlibrary, от которого зависит.

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