Карта произвольного доступа Java - PullRequest
0 голосов
/ 18 ноября 2010

Я ищу библиотеку с открытым исходным кодом, в которой реализована карта произвольного доступа.Мне нужна карта, которая поддерживает свой хэш-индекс, но также индексирует значения в порядке вставки, как LinkedHashmap, за исключением того, что вам не нужно перебирать ее, чтобы найти, например.элемент 2. Примерно так:

Map m = new ArrayMap();
m.put("0", "v0");
m.put("1", "v1");
m.put("2", "v2");
m.put("3", "v3");
затем:
assertEquals("v2", m.get("2"));
assertEquals("v2", m.getAtIndex(2));

Идея состоит в том, что оба типа поиска должны быть быстрыми.

Быстрый Google ничего не нашел, я не сделалЯ не вижу его в коллекциях Guava или Commons (возможно, я упустил это из виду).У меня действительно нет времени, чтобы реализовать это должным образом прямо сейчас.

Ответы [ 4 ]

4 голосов
/ 18 ноября 2010

Если ваш Map может быть неизменным, вы можете сделать это:

ImmutableMap<String, String> map = ...
String v2 = map.entrySet().asList().get(2).getValue();

asList() на entrySet() для обычного ImmutableMap просто использует собственный массив записей карты напрямую, так что это произвольный доступ и быстрый.

2 голосов
/ 18 ноября 2010

Если ваша карта статическая или если она только что обновлена, вы можете использовать values() метод LinkedHashMap, который предоставляет список значений карты как Collection<T>. Затем вы можете преобразовать набор в массив с toArray(T[] a), и у вас будет постоянный доступ к элементам, конечно, это приведет к потере некоторой памяти для хранения дополнительных ссылок, но вы задаете две конкретные хорошие сложности, поэтому компромисс памяти необходимо. Это будет хорошо, если вам не нужно получать значения, когда вы добавляете их по-разному.

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

1 голос
/ 18 ноября 2010

Вы хотите посмотреть значения двумя разными способами.Самый простой / быстрый способ сделать это - сохранить две коллекции, одну Map и одну ArrayList.

private final Map<String, String> map;
private final List<String> list;

public void put(String key, String value) {
   map.put(key,value);
   list.add(value);
}

public String get(String key) {
   return map.get(key);
}

public String get(int index) {
   return list.get(index);
}
0 голосов
/ 18 ноября 2010

Я думаю, что LinkedHashMap - это именно то, что вам нужно.

Вы можете использовать его как карту:

map.get("v2");

и как список:

new ArrayList(map.values().values()).get(2);

Если вы хотите написать собственный класс из 5 строк, который реализует эту логику.

...