2010-10-28 7 views
3

Я хочу сопоставить целые числа в строки, они являются один-к-одному, таких как:Какую коллекцию использовать в Java?

60 : c 
61 : c# 
62 : d 
63 : d# 
64 : e 
65 : f 
66 : f# 

Но мне нужно, чтобы иметь возможность сделать следующее:

  1. Получить значение из key: "c" = getValue (60) [дать ему ключ 60, значение возвращаемой строки]
  2. получить ключ от значения: 65 = getKey ("f") [дать ему строковое значение «f», вернуть a ключ]

Какая модель коллекции лучше всего подходит для этого? Я спрашиваю, потому что я посмотрел на несколько из них, никто не может сделать часть < 2>. Или мне нужно написать код, чтобы пройти через каждую пару, чтобы найти, какой ключ имеет значение «f»?

Редактировать: Ничего в jdk1.6 делает это?

+0

ли каждое число ассоциированное значение? –

+0

номера от 12 до 107 связаны со строкой – Frank

+1

«Ничто в jdk1.6 не делает это?» Неа. – Thilo

ответ

0

нашел это на другом форуме (link text)

public class ReversibleMap { 
     private final Map keyToValue = new HashMap(8); 
     private final Map valueToKey = new HashMap(8); 

     public void put(Integer key, String value) { 
      keyToValue.put(key, value); 
      valueToKey.put(value, key); 
     } 

     public String get(Integer key) { 
      return (String) keyToValue.get(key); 
     } 

     public Integer getKey(String value) { 
      return (Integer) valueToKey.get(value); 
     } 
    } 

Это должно сделать

+0

'HashMap' должен быть' LinkedHashMap' для двунаправленного использования. –

+0

Простой и точка ответа на мой вопрос, спасибо! – Frank

5

что вам нужно - это BiMap. Библиотека google guava предоставляет эту коллекцию.

6

Если вы не хотите включать коллекцию коллекций или guava, просто используйте две отдельные карты - вы можете программно создать обратное отображение из первого с помощью простого цикла foreach. Я бы предложил создать код, чтобы весь доступ к этим картам был внутренним для одного класса (поскольку он является деталью реализации и должен быть скрыт от остальной части системы). Другими словами, не передавайте эти карты каким-либо методам. Затем вы можете легко переключиться на более подходящую коллекцию, если позже захотите.

1

Привет Я хотел бы вставляю пару вещей Стандарты карты в Java работать однонаправленно: дайте ключ получить объект (ы) я не знаю о Java класса jdk1.6, что делает это

пару идей 1) создать класс, который имеет 2 карты один с другим и с, это не так сложно реализовать ^^

2) Если Вашие данные, как Опубликованная И ЕСЛИ это предопределенный ассоциативный список, почему бы не попробовать и не перечислить? или ArrayList?

Джейсон

1

Если это с фиксированным набором пар ключ-значение музыкальные ноты, то вы можете рассмотреть возможность использования enum с картой обратного поиска. Вы все равно получите два HashMaps, но, по крайней мере, они объединены в перечисление.

enum Note { 
    C("C",60), CSHARP("C#",61), D("D",62), DSHARP("D#",63); //etc.. 
    final int value; 
    final String symbol; 
    static final Map<Integer, Note> lookup = new HashMap<Integer, Note>(); 
    static { 
     for(Note n : Note.values()) { 
      lookup.put(n.value, n); 
     } 
    } 

    Note(String symbol, int value) { 
     this.symbol = symbol; 
     this.value = value; 
    } 

    static Note get(int i) { 
     return lookup.get(i); 
    } 
} 

Затем, чтобы получить значения и символы, используйте этот

System.out.println(Note.get(61)); 
System.out.println(Note.get(61).symbol); 
System.out.println(Note.CSHARP.value); 
System.out.println(Note.CSHARP.symbol); 

, что приведет к

CSHARP 
C# 
61 
C# 

PS. Модификаторы удаляются для краткости. PSS. Добавьте другую карту поиска для символа.