user755806
user755806

Reputation: 6815

Best design/coding to accomplish the below requirement?

I am using Java 1.7. I have below map.

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

But map can contain values as below.

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

Basically the map can contain N values where is N is generic it can contain any number of values.

I have one more value for group of keys as below.

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

Now map can contain any one of above key sets.

In that case based on the key set in the map it has to return corresponding value.

Ex:

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

What is the best place to keep above key sets and corresponding values? Shall i consider enum? The logic has to take map and return value.

What is the best way to do that?

Upvotes: 3

Views: 141

Answers (3)

Ajinkya
Ajinkya

Reputation: 22710

You can use Apache MultiKeyMap

Example

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

Resultant map

enter image description here

Similar question: How to implement a Map with multiple keys?


EDIT :

You can have a custom key class which can have N number of keys. Something like

Class MyKey{
  List<String> keys;
}

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

Also override appropriate methods of Map like equals,hashcode,get etc.

Upvotes: 1

venkat530
venkat530

Reputation: 43

You can use as below :

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"]);

Ex:if you have a map object with keys as "one" and "two"

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;
        }
    }
}

Upvotes: 0

Ceryni
Ceryni

Reputation: 714

Maybe this?

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));

Try running this and see if it's the behavior you're wanting.

Upvotes: 0

Related Questions