В 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
Вопрос, хотя: существует ли лучшая структура данных для этого?
Любой Map
подойдет - вы сохраняете только ссылку на строку, а не ее копию, поэтому не имеет значения, как долго Это.
Если вы создаете одно и то же строковое значение несколько раз, используйте intern ()
, чтобы каждый раз получать один и тот же объект String для значения.
Почему бы не инвертировать пару ключ/значение? Используйте набор или массив для значений:
x->{3, 4}
y->{0, 1, 2, 5, 7}
z->{6, 8, 9}
Java автоматически объединит для вас ссылки на строки, поэтому вам не нужно делать это вручную для экономии памяти. Вы можете просто поместить ключи / значения в HashMap.
Я не совсем понимаю вопрос. Если у вас есть массив строк: 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;
//...
Если вам не нравится предложение Пита Киркхэма (что было бы лучшим способом, ИМО), вы можете использовать Коллекции Google (э ... Guava сейчас) MultiMap
.