2009-07-15 4 views
1

Какой класс коллекции дженериков я могу использовать, который предоставляет как функции сопоставления, так и массива. Например, я хочу сопоставить String с Double, и я хочу ссылаться на значение с помощью ключа в качестве индекса.Java - Collection Selection

collection[key] = collection[key] + double 

Предоставляет ли библиотека коллекций Google такую ​​функциональность?

Спасибо.

ответ

2

Java не позволит вам использовать синтаксис брекет с коллекциями, но вы могли бы сделать что-то вроде:

HashMap<String, Double> collection = new HashMap<String, Double>(); 

String key = "some key"; 
... 

if(collection.containsKey(key)) 
{ 
    // increment the value 
    collection.put(key, collection.get(key) + 1.0); 
} 
else 
{ 
    // initialize the value 
    collection.put(key, 0.0); 
} 
+0

(Если кто-то читает это через год, JDK7 может иметь синтаксис '[]' для коллекций.) –

+0

Спасибо Том, я не знал, что это было запланировано. Надеюсь, кто-то скажет мне об этом, если я забуду вернуться к нему, когда появится Java 7. –

1

Я использую java.util.HashMap для пар ключ-значение, если производительность не является проблемой, которой она почти всегда не так.

+0

HashMap о наиболее производительным, что вы собираетесь придумать против прямых поисков. Добавления могут быть немного медленнее, чем связанный список. Если вы не сильно ограничены в памяти, вы не будете бить хэш для производительности в любой ситуации поиска, кроме индекса в массив или ArrayList. –

2

Вы вроде должны выбрать здесь :-) Либо ваш ключ является строка:

Map<String, Double> myMap = new HashMap<String, Double>(); 
myMap.put("key1", 5.0); // caution - auto-wrap 
myMap.put("key1", myMap.get("key1") + 5.0); // caution - auto-wrap 

или что это ИНТ:

double[] myArray = new double[size]; 
int key1 = 1; 
myArray[key1] = 5.0; 
myArray[key1] += 5.0; 
1

Я не вижу, как ваш пример использует массив подобная функциональность. Вы просто имеете в виду перегрузку оператора индекса массива? Если это так, вы должны знать, что Java не позволяет перегрузке оператора.

Если вам действительно нужны операции с массивом, LinkedHashMap позволяет выполнять поиск по ключевым словам, а также отслеживать порядок в пределах значений. Это в первую очередь полезно для создания кеша LRU.

+0

Я был в режиме C#. оператор индекса массива - это именно то, о чем я думал. – javacavaj

0

да, я хотел бы сделать то же самое некоторое время назад, когда я хотел, чтобы представить таблицу базы данных в структуре данных, где был столбец «lookup» первичного ключа. HashMap не сделал бы это сам (насколько я знаю).

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

кто-то, возможно, объяснил бы намного лучше, чем я. Im только новичок.

1

Ближайшим, что я могу видеть, является LinkedHashMap, который дает вам предсказуемый порядок элементов, но это не дает вам быстрый поиск заданного индекса (таким образом это похоже на LinkedList). И это не дает вам определенного метода для поиска по определенному индексу, вам придется добавить свой собственный.

+0

yep, этот ответ - билет. heres пример: http://www.java-examples.com/simple-java-linkedhashmap-example – djangofan

0

Вы имеете в виду массивную функциональность или синтаксис, подобный массиву. Java не позволяет коллекциям использовать синтаксис типа массива, но все коллекции имеют некоторую форму функциональности, подобной массиву.

Если вы имеете в виду, что хотите хранить пары (ключ/значение) И иметь доступ к ним с индексом (например, вы должны были бы массивом), то на нем есть коллекция «LinkedHashMap» с вашим именем.

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