2013-08-22 3 views
0

Я хочу написать метод, который возьмет карту в качестве параметра и заменит ключи и значения этой карты на значения и ключи. Я пытаюсь сделать это следующим образом:Как заменить значение ключа клавишами значений карты

public class HashMapKeyValueInterchange{ 
     public static Map<String, String> getMyMap(ConcurrentHashMap<String, String> m){ 
      Map<String, String> map2 = new HashMap<String, String>(); 
      for(Entry<String, String> e:m.entrySet()){ 
       map2.put(e.getValue(), e.getKey()); 
      } 
      return map2; 
     } 

     public static void main(String[] args) { 
      ConcurrentHashMap<String, String> map1 = new ConcurrentHashMap<String, String>(); 
      map1.put("ajay", "btech"); 
      map1.put("manas", "mca"); 
      map1.put("ashu", "mba"); 
     }  
} 

Используя этот метод, я могу получить новую карту (map2) с замененным ключом и значением, но я хочу map1 быть обменены

+0

Какой вопрос? – BobTheBuilder

+1

Где код, использующий класс HashMapKeyValueInterchange? –

+0

ИМО, что вы сделали, выглядит хорошо .. Я не думаю, что есть лучший способ! – sanbhat

ответ

2

Это Availabe, нет нужно изобретать колесо, если вы используете библиотеку google collection Guava, тогда вы можете использовать BiMap<K,V>.

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

Реализация BiMap являются EnumBiMap, EnumHashBiMap, [HashBiMap][2], ImmutableBiMap

+0

Seema мне как Guava заново изобрел колесо здесь и, см. Http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/BidiMap.html – oddparity

0

Если вопрос, если код работает, ответ да. Некоторые комментарии:

  1. Если вы хотите, чтобы ваш код был протестирован, вам необходимо позвонить getMyMap с map1 или другим подходящим параметром.
  2. Если вы хотите увидеть какой-либо вывод, вам нужно написать что-то вроде System.out.println(getMyMap(map1));
  3. я настоятельно рекомендую использовать Map вместо ConcurrentHashMap в getMyMap «S 1-го типа параметра, поэтому функция более Общие положения работает с другими карты.
  4. Чтобы сделать код еще более общим, сделать это:

    public static <K,V> void getMyMap(Map<V,K> output,Map<K,V> input) { 
        for(Entry<K,V> e: input.entrySet()) { 
         output.put(e.getValue(), e.getKey()); 
        } 
    } 
    

    Это будет принимать большее разнообразие Map-х и хранение выходных данных в любом типе Map передаются в качестве первого параметра. Пример:

    getMyMap(new TreeMap<String,String>(),map1); 
    getMyMap(new HashMap<String,String>(),map1); 
    

Заключительное Дело в том, что вы не указываете поведение, когда значения повторяются. Вышеприведенное предположение состоит в том, что либо этот случай не возникает, либо что любой ключ на входной карте допустим как значение в выходном.

0

Используйте этот код

public static ConcurrentHashMap<String, String> getMyMap(ConcurrentHashMap<String, String> m){ 
     ConcurrentHashMap<String, String> map2 = new ConcurrentHashMap<String, String>(); 
     for(Entry<String, String> e:m.entrySet()){ 
      map2.put(e.getValue(), e.getKey()); 
     } 
     return map2; 
} 
public static void main(String[] args) { 
    ConcurrentHashMap<String, String> map1 = new ConcurrentHashMap<String, String>(); 
    map1.put("ajay", "btech"); 
    map1.put("manas", "mca"); 
    map1.put("ashu", "mba"); 
    map1 = getMyMap(map1); 
} 
0

BiMap является хорошим выбором для такого рода операции

BiMap является карта, которая позволяет просматривать «обратный» BiMap с обратным() гарантирует, что значения являются уникальными, делая значения() a Набор

BiMap.put(key, value) выдает IllegalArgumentException, если вы попытаетесь сопоставить ключ с уже существующим значением. Если вы хотите удалить любую ранее существующую запись с указанным значением, вместо этого используйте BiMap.forcePut(key, value).

BiMap<String, Integer> userId = HashBiMap.create(); 
String userForId = userId.inverse().get(id); 

Look here для получения дополнительной информации

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