Как отсортировать Java Hashtable? - PullRequest
8 голосов
/ 02 декабря 2010

Я вставил некоторые данные в Java Hashtable.Если я читаю данные из Hashtable, они возвращаются не в том порядке, в котором я их вставил. Как получить упорядоченные данные из Hashtable?

Я использую следующий код для получения значений из хеш-таблицы:

// Get a set of the entries
Set set = hsUpdateValues.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while (i.hasNext()) {
    Map.Entry me = (Map.Entry) i.next();            
    System.out.print(
        "Key : " + me.getKey()
        + ", Value: " + me.getValue()
    );
}

Ответы [ 7 ]

22 голосов
/ 02 декабря 2010

Если вам нужна карта, сохраняющая порядок, вы должны использовать LinkedHashMap:

Реализация хеш-таблицы и связанного списка интерфейса Map с предсказуемым порядком итераций.Эта реализация отличается от HashMap тем, что поддерживает двусвязный список, проходящий через все его записи.Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки).Обратите внимание, что порядок вставки не изменяется, если ключ повторно вставлен в карту.(Ключ k повторно вставляется в карту m, если m.put(k, v) вызывается, когда m.containsKey(k) вернул бы true непосредственно перед вызовом.)

Эта реализация избавляет своих клиентов от неопределенного, как правило,хаотическое упорядочение, предоставляемое HashMapHashtable), без увеличения стоимости, связанного с TreeMap.

Обратите внимание, что это обычно сравнивается с HashMap, а не Hashtable -Я не знаю сохраняющего порядок эквивалента Hashtable;последний обычно не используется в наши дни в любом случае (так же, как ArrayList обычно используется вместо Vector).

Я предположил, что вы хотите вставка порядок, а не сортировка по ключу заказ.Если вы хотите последнее, используйте TreeMap.

7 голосов
/ 17 июля 2012

Хотя Hashtable не может быть отсортировано, он спросил, как получить отсортированные данные, что можно сделать, отсортировав список ключей, извлеченных из HashTable, и получив значения в указанном порядке.Что-то вроде:

List<'your_type'> tmp = Collections.list('your_hashtable'.keys());
Collections.sort(tmp);
Iterator<'your_type'> it = tmp.iterator();

while(it.hasNext()){
    'your_type' element =it.next();
    //here you can get ordered things: 'your_hashtable'.get(element);
}

будет хорошо.

7 голосов
/ 02 декабря 2010

A Hashtable не имеет предсказуемого порядка итераций и не может быть отсортировано.Если вам нужен только предсказуемый порядок итераций, вы должны использовать LinkedHashMap.Если вы хотите иметь возможность сортировать Map, вы должны использовать TreeMap.

3 голосов
/ 02 декабря 2010

Hashtable - это устаревшая коллекция, которая была заменена коллекциями Java 1.2 в 1998 году. Я предлагаю вам избегать этого, наряду с Vector и Enumeration.

Вместо Hashtable используйте HashMap где возможно.Вы можете добавить синхронизацию, используя Collections.synchronizedMap(map), если вам это нужно.

Вместо Vector используйте ArrayList, где это возможно.Вы можете добавить синхронизацию, используя Collections.synchronizedList(map), если вам это нужно.

Вместо Enumeration вы можете использовать Iterator или даже цикл for-each.

3 голосов
/ 02 декабря 2010

Используйте TreeMap для сортировки:

Map<String, String> yourMap = new HashMap<String, String>();
    yourMap.put("1", "one");
    yourMap.put("2", "two");
    yourMap.put("3", "three");

Map<String, String> sortedMap = new TreeMap<String, String>(yourMap);
0 голосов
/ 02 декабря 2010
0 голосов
/ 02 декабря 2010

Если я читаю данные из хеш-таблицы, они идут не в том порядке, в котором я их вставил.

Ваш вопрос не имеет смысла.У Hashtable нет «порядка», он неупорядочен (Правка: в некоторых реализациях есть порядок, но он не является обычным для хеш-таблицы) ..

В каком порядке вы ожидаете, что записи будут?

Если вы хотите хранить элементы в определенном порядке, вам нужно использовать список (например, подкласс java.util.List).

И кстати, ваш пример кода даже несодержит хеш-таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...