Java数据结构将多个键映射到相同的值

时间:2010-06-15 15:24:00

标签: java data-structures

在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

问题:是否有更好的数据结构?

6 个答案:

答案 0 :(得分:19)

任何Map<Integer,String>都可以 - 你只存储对字符串的引用,而不是它的副本,所以无论多长时间都没关系。

如果要多次构建相同的字符串值,请使用intern()每次为该值获取相同的String对象。

答案 1 :(得分:2)

为什么不反转键/值配对?使用Set或数组作为值:

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

答案 2 :(得分:1)

我真的不明白这个问题。如果你有一个字符串数组: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;
//...

答案 3 :(得分:1)

如果你不喜欢Pete Kirkham的建议(这是最好的方式,IMO),你可以使用Google Collections(呃... Guava现在)MultiMap

答案 4 :(得分:0)

每个映射条目将使用几百位来表示理论上可以保存在2中的值。

如果键比每几百个整数1的数字更密集,那么根本不使用地图会更快更小,而是数组 - 类似于Trove TByteArrayList - 其中字节值映射到您的字符串。如果你想增加4倍的密度,可以将4个值打包成一个字节。

只有当你掌握了大量数据时,这才有意义 - 但是你说数以百万计的密钥,所以我觉得这很合适。

答案 5 :(得分:-1)

Java会自动为您整合String引用,因此您无需手动执行此操作以节省内存。您可以将键/值放在HashMap中。