2009-09-17 3 views
1

Могу ли я поменять клавиши двух значений хэш-карты, или мне нужно сделать что-нибудь умное?Java Hashmap: обмен двумя значениями?

Что-то, что будет выглядеть примерно так:

Map.Entry<Integer, String> prev = null; 
    for (Map.Entry<Integer, String> entry: collection.entrySet()) { 
     if (prev != null) { 
      if (entry.isBefore(prev)) { 
       entry.swapWith(prev) 
      } 
     } 
     prev = entry; 
    } 
+0

Вы пытаетесь разобраться кучу элементов, используя ключ? Просто используйте TreeMap вместо этого и предоставите Comparator или переопределите equals и compareTo. – aberrant80

+0

Это, вероятно, требует немного большего объяснения. Что такое целые ключи? Применяют ли они какой-то порядок? Если да, и если вы сортируете на основе значения String, почему бы просто не использовать список вместо этого? Или ключ имеет какой-то другой смысл? – cletus

ответ

3

Ну, если вы только после того, как карты, где ключи упорядочены, используйте SortedMap вместо этого.

SortedMap<Integer, String> map = new TreeMap<Integer, String>(); 

Вы можете рассчитывать на естественном порядке ключа (как, в его интерфейсе Comparable), или вы можете сделать заказ на заказ пропускания Comparator.

В качестве альтернативы вы можете позвонить по номеру setValue() по телефону Entry.

Map.Entry<Integer, String> prev = null; 
for (Map.Entry<Integer, String> entry: collection.entrySet()) { 
    if (prev != null) { 
    if (entry.isBefore(prev)) { 
     String current = entry.getValue(); 
     entry.setValue(prev.getValue(); 
     prev.setValue(current); 
    } 
    } 
    prev = entry; 
} 

Лично я бы просто пошел с SortedMap.

+0

Я пытаюсь сортировать значения String в соответствии с определенным алгоритмом. –

+1

Затем напишите сопоставимый интерфейс и передайте его конструктору для карты. См. Http://java.sun.com/javase/6/docs/api/java/util/Comparator.html и http://java.sun.com/javase/6/docs/api/java/util/TreeMap. .html – Jherico

+0

На самом деле, если вы пытаетесь отсортировать строковые значения, то то, что вы хотите, это Map . – Jherico

1

Там нет ничего подобного, что в интерфейсах Map или Entry, но это довольно просто реализовать:

Map.Entry<Integer, String> prev = null; 
    for (Map.Entry<Integer, String> entry: collection.entrySet()) { 
      if (prev != null) { 
        if (entry.isBefore(prev)) { 
          swapValues(e, prev); 
        } 
      } 
      prev = entry; 
    } 

    private static <V> void swapValues(Map.Entry<?, V> first, Map.Entry<?, V> second) 
    { 
      first.setValue(second.setValue(first.getValue())); 
    } 
Смежные вопросы