2015-08-24 4 views
0

Это первый раз, когда я должен заказать HashMap в Java. Мне нужно сделать это с помощью ключа, но в моем случае ключ - это объект, поэтому мне нужно заказать его по определенному полю. Пытаясь понять это по моему Я считал, чтобы продолжить с этим простым скрипом кода:Лучший способ заказать HashMap ключом на Java?

private HashMap<SimpleDBField, String> sortTable(HashMap<SimpleDBField, String> row){ 

    LinkedHashMap<SimpleDBField, String> orderedRow = new LinkedHashMap<SimpleDBField, String>(); 

    for(int i = 1; i <= row.size(); i ++){ 
     Iterator iterator = row.entrySet().iterator(); 

     while(iterator.hasNext()){ 
      Map.Entry<SimpleDBField, String> entry = (Map.Entry<SimpleDBField, String>) iterator.next(); 

      if(entry.getKey().getListPosition()==i){ 
       orderedRow.put(entry.getKey(), entry.getValue()); 
       break; 
      } 
     } 
    } 

    return orderedRow; 
} 

Если предположить, что это работает, и я не забочусь о производительности, прежде, чем на самом деле использовать его, я хотел бы знать, если следующая царапина кода может быть лучше и важнее: почему?

Пример ниже источник здесь: How to sort HashMap by key and value in Java

public static <K extends Comparable,V extends Comparable> Map<K,V> sortByKeys(Map<K,V> map){ 

    List<K> keys = new LinkedList<K>(map.keySet()); 

    Collections.sort(keys); 

    Map<K,V> sortedMap = new LinkedHashMap<K,V>(); 

    for(K key: keys){ 
     sortedMap.put(key, map.get(key)); 

    } 

    return sortedMap; 
} 

Если оба не правы, как я должен делать это?

+0

возможно дубликат [Как отсортировать HashMap в Java] (http://stackoverflow.com/questions/780541/how-to-sort- a-hashmap-in-java) –

+0

Вы не можете этого сделать; по определению, HashMap не имеет определенного порядка для своих ключей. Кроме того, вам нужен порядок вставки или некоторый естественный порядок (т. Е. С помощью Comparable)? – fge

+0

Хэш-коллекции всегда неупорядочены, чтобы обеспечить максимально возможную производительность доступа по ключу. –

ответ

5

Вы не можете контролировать заказ HashMap, как вы видели. A LinkedHashMap - всего лишь HashMap с предсказуемым порядком итерации - это шаг в правильном направлении, но это все еще слишком усложняет ситуацию. Java имеет встроенный интерфейс для сортированных карт (с неудивительным именем SortedMap) и несколькими реализациями, наиболее популярными из которых являются TreeMap. Просто используйте его, и пусть Java делать всю тяжелую работу:

public static <K extends Comparable, V> Map<K,V> sortByKeys(Map<K,V> map) { 
    return new TreeMap<>(map); 
} 
6

Лучшим способом является использование TreeMap.

TreeMap<Foo, Bar> foo = new TreeMap(myHashMap);

Если вам нужен собственный компаратор, вы можете использовать new TreeMap(Comparator c), а затем добавить содержимое HashMap там с foo.putAll(myMap);.

0

да,

мы можем использовать TreeMap.

TreeMap foo = new TreeMap (myHashMap);

0

В java8, вы можете использовать следующий код:

public static <K extends Comparable, V> Map<K,V> sortMapByKey(Map<K, V> unsortedMap) { 
    Map<K, V> sortedMap = new LinkedHashMap<>(); 

    unsortedMap.entrySet().stream() 
      .sorted(Map.Entry.<K, V>comparingByKey()) 
      .forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue())); 
    return sortedMap; 
}