我有一组哈希表的数据部分如下:
static {
A_map.put(KEY_1, value0);
A_map.put(KEY_2, value1);
A_map.put(KEY_3, value2);
A_map.put(KEY_4, value3);
...
A_map.put(KEY_N, valueN);
B_map.put(KEY_1, Xvalue0);
B_map.put(KEY_2, Xvalue1);
B_map.put(KEY_3, Xvalue2);
B_map.put(KEY_4, Xvalue3);
...
B_map.put(KEY_N, XvalueN);
C_map.put(KEY_1, Yvalue0);
C_map.put(KEY_2, Yvalue1);
C_map.put(KEY_3, Yvalue2);
C_map.put(KEY_4, Yvalue3);
...
C_map.put(KEY_N, YvalueN);
....etc
}
即。所有哈希中的键都相同,但每个哈希映射的值不同 我选择在运行时使用哪个哈希映射,因为我已将这些哈希映射作为值放到另一个哈希映射中。
但我认为这可以更干净。我的意思是所有哈希映射中的键都是相同的,并且根据我在运行时选择的hashmap类型,只有值应该不同。
什么是干净利落地设计的好方法?
答案 0 :(得分:2)
我认为Google Guava's Table structure适合您的用例,就像魅力一样。 Table<RowKey, ColumnKey, Value>
是Map<RowKey, Map<ColumnKey, Value>>
等结构的绝佳替代品,恰好是您的确切情况。
从概念上讲,您可以使用哈希的名称作为行键(示例中的A,B,C等),并使用实际键作为列键(KEY_1,KEY_2,KEY_3等)例子)。
当您实际处理哈希表时,我建议您使用HashBasedTable
:
Table<String, String, String> table =
HashBasedTable.create(M, N); // M maps, N keys per map
table.put(A, KEY_1, value0);
table.put(A, KEY_2, value1);
table.put(A, KEY_3, value2);
table.put(A, KEY_4, value3);
...
table.put(A, KEY_N, valueN);
table.put(B, KEY_1, Xvalue0);
table.put(B, KEY_2, Xvalue1);
table.put(B, KEY_3, Xvalue2);
table.put(B, KEY_4, Xvalue3);
...
table.put(B, KEY_N, XvalueN);
...
...
table.put(M, KEY_1, Yvalue0);
table.put(M, KEY_2, Yvalue1);
table.put(M, KEY_3, Yvalue2);
table.put(M, KEY_4, Yvalue3);
...
table.put(M, KEY_N, YvalueN);
如果您需要获取A
的所有映射,可以使用Table
&#39 {s} row()
方法:
Map<String, String> mapA = table.row(A);
请记住,此结构针对行进行了优化,这意味着在列上仅基于 获取数据需要进行一些迭代。
答案 1 :(得分:0)
通常你会在它自己的文件中提取这种信息,例如.ini。 Java为此目的拥有自己的类,称为Properties.
如果您正在尝试国际化您的应用程序(带有键的HashMaps和不同语言的值),我建议您查看ResourceBundles
如果您真的想坚持使用代码,可以为数组中的每个键编写所有值,然后通过遍历数组自动创建HashMaps
编辑:
String[] keys = {"KEY_1", "KEY_2", "KEY_3"};
String[] values = {
{"VALUE_1_FOR_KEY_1", "VALUE_2_FOR_KEY_1", "VALUE_3_FOR_KEY_1"},
{"VALUE_1_FOR_KEY_2", "VALUE_2_FOR_KEY_2", "VALUE_3_FOR_KEY_2"},
{"VALUE_1_FOR_KEY_3", "VALUE_2_FOR_KEY_3", "VALUE_3_FOR_KEY_3"},
}
int valueToChoose = 1;
HashMap<String, String> map = new HashMap<>();
for(int i = 0; i < keys.length; i++) {
map.put(keys[i], values[i][valueToChoose];
}
答案 2 :(得分:0)
如何使用List而不是HashMap,因为每个表中的键都是常量且相同的。
你可以这样做:
enum Keys {
_1(0), _2(1), _3(2), _4(3);
private int id = -1;
private Keys(int i) {
this.id = i;
}
int index() {
return id;
}
}
static {
aList = new ArrayList<String>(Keys.values().length);
aList.set(Keys._1.index(), "a1");
aList.set(Keys._2.index(), "a2");
aList.set(Keys._3.index(), "a3");
aList.set(Keys._4.index(), "a4");
bList = new ArrayList<String>(Keys.values().length);
bList.set(Keys._1.index(), "b1");
bList.set(Keys._2.index(), "b2");
bList.set(Keys._3.index(), "b3");
bList.set(Keys._4.index(), "b4");
}