最佳设计/编码,以满足以下要求?

时间:2014-01-02 07:40:12

标签: java

我正在使用Java 1.7。我有下面的地图。

Map<String, String> keyValues = new HashMap<>();

但是地图可以包含以下值。

keyValues.put("one", "value1");
keyValues.put("two", "value2");

OR

keyValues.put("four", "value1");
keyValues.put("two", "value2");
keyValues.put("seven", "value3");

OR

keyValues.put("one", "value1");
keyValues.put("two", "value2");
keyValues.put("three", "value3");

基本上地图可以包含 N 值,其中N是通用的,它可以包含任意数量的值。

我还有一组键值,如下所示。

keys one, two belongs to 12345SRT
keys one, two, three, four belongs to 12345SRTSSS
keys four, two, seven belongs to 764RTYL87

现在,map可以包含上述任何一个键集。

在这种情况下,基于地图中的键集,它必须返回相应的值。

前:

If map contains one and two then it should return 12345SRT.
     If map contains four,two and seven then logic should return 764RTYL87.

保留上面的键集和相应值的最佳位置是什么? 我应该考虑枚举吗? 逻辑必须采用map和return值。

最好的方法是什么?

3 个答案:

答案 0 :(得分:1)

您可以使用Apache MultiKeyMap

示例

 MultiKeyMap multiKeyMap = new MultiKeyMap();
 multiKeyMap.put("New York","IBM","Sam");
 multiKeyMap.put("Sydney","Infosys","Honey");
 multiKeyMap.put("Prague","JP Morgan","Peter");
 multiKeyMap.put("Scotland","RBS","Deny");
 multiKeyMap.put("Paris","Nomura","Lily");
 multiKeyMap.put("Melbourne","Citi Bank","Sandy");
 multiKeyMap.put("Aukland","Bank of America","Tommy");  

结果地图

enter image description here

类似的问题:How to implement a Map with multiple keys?


编辑:

您可以拥有一个可以拥有N个键的自定义键类。 像

这样的东西
Class MyKey{
  List<String> keys;
}

Map<MyKey, String> keyValues = new HashMap<>();  

同时覆盖适当的地图方法,例如equalshashcodeget等。

答案 1 :(得分:0)

您可以使用如下:

Map<String, ArrayList<String>> keyValues = new HashMap<String, ArrayList<String>();
keyValues.put("12345SRT",["one","two"]);
keyValues.put("12345SRTSSS",["one", "two", "three", "four"]);
keyValues.put("764RTYL87",["four", "two", "seven"]);

例如:如果你有一个地图对象,其键为“一”和“两个”

String getKey(map){
    for (Map.Entry<String, Object> e : keyValues.entrySet()) {
        String key = e.getKey();
        ArrayList<string> value = e.getValue();
        if(value.containsAll(map.keySet())){
            return key;
        }
    }
}

答案 2 :(得分:0)

也许这个?

HashMap<Set<String>, String> multiMap = new HashMap<Set<String>, String>();
Set<String> mk1 = new HashSet<String>();
mk1.add("one");
mk1.add("two");
mk1.add("three");
multiMap.put(mk1, "derp");

Set<String> checker = new HashSet<String>();
checker.add("two");
checker.add("three");
checker.add("one");

if(multiMap.containsKey(checker))
    System.out.println(multiMap.get(checker));

尝试运行此功能,看看它是否是您想要的行为。