根据"模板"动态创建一个哈希映射。带有干净代码的hashmap

时间:2015-03-08 14:47:06

标签: java oop design-patterns collections hashmap

我有一组哈希表的数据部分如下:

    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类型,只有值应该不同。
什么是干净利落地设计的好方法?

3 个答案:

答案 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");

}