Java datastructure для отображения нескольких ключей к тому же значению

В Java я ищу способ отобразить несколько ключей к тому же значению. Скажем, у меня есть номера 0-9 как ключи и "x", "y" и "z" как значения следующим образом:

0->y
1->y
2->y
3->x
4->x
5->y
6->z
7->y
8->z
9->z

теперь x, y и z являются действительно длинными строками, и у меня есть миллионы ключей, таким образом, я не могу позволить себе сохранить строки многократно. Как Вы пошли бы об этом?

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

0->k1
1->k1
2->k1
3->k2
4->k2
5->k1
6->k3
7->k1
8->k3
9->k3

k1->y
k2->x
k3->z

Вопрос, хотя: существует ли лучшая структура данных для этого?

7
задан eikes 15 June 2010 в 15:24
поделиться

5 ответов

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

Если вы создаете одно и то же строковое значение несколько раз, используйте intern () , чтобы каждый раз получать один и тот же объект String для значения.

19
ответ дан 6 December 2019 в 07:50
поделиться

Почему бы не инвертировать пару ключ/значение? Используйте набор или массив для значений:

x->{3, 4}
y->{0, 1, 2, 5, 7}
z->{6, 8, 9}
2
ответ дан 6 December 2019 в 07:50
поделиться

Java автоматически объединит для вас ссылки на строки, поэтому вам не нужно делать это вручную для экономии памяти. Вы можете просто поместить ключи / значения в HashMap.

-1
ответ дан 6 December 2019 в 07:50
поделиться

Я не совсем понимаю вопрос. Если у вас есть массив строк: String[] arr, то просто задайте разные индексы одному и тому же объекту - т.е. сделайте ссылки одинаковыми.

String[] map = new String[10];
String x = "foo";
String y = "bar";
String z = "baz";
map[0] = x;
map[1] = y;
map[2] = x;
//...
2
ответ дан 6 December 2019 в 07:50
поделиться

Если вам не нравится предложение Пита Киркхэма (что было бы лучшим способом, ИМО), вы можете использовать Коллекции Google (э ... Guava сейчас) MultiMap .

1
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: