Java - выбор коллекции - PullRequest
1 голос
/ 16 июля 2009

Какой универсальный класс коллекции я могу использовать, который обеспечивает как отображение, так и массивоподобную функциональность. Например, я хочу сопоставить строку с двойным, и я хочу сослаться на значение, используя ключ в качестве индекса.

collection[key] = collection[key] + double

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

Спасибо.

Ответы [ 9 ]

4 голосов
/ 16 июля 2009

HashMap должен служить вашим целям:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html

2 голосов
/ 16 июля 2009

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 );
}
2 голосов
/ 16 июля 2009

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

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

или это int:

double[] myArray = new double[size];
int key1 = 1;
myArray[key1] = 5.0;
myArray[key1] += 5.0;
1 голос
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

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

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

1 голос
/ 16 июля 2009

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

0 голосов
/ 02 августа 2009

В Google Collections есть мультисеть, которая связывает каждый ключ с целым числом.

http://google -collections.googlecode.com / SVN / багажник / Javadoc / COM / Google / общие / собирать / Multiset.html

0 голосов
/ 16 июля 2009

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

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

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

0 голосов
/ 16 июля 2009

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

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

Кто-то другой, вероятно, мог бы объяснить намного лучше, чем я. Я только начинающий.

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