tags:

views:

167

answers:

2

I’ve got an existing instance of HashMap simply called sale (it is Map<String, Set<String>>) I use it to log customers and items history.

Is there a way to create a new instance of HashMap, that effectively reverses this usage? i.e will show each item purchased as a unique key and the corresponding value as a String set of the customers that have purchased that product. I suspect there is a simple process using keySet() in some way to iterate over the sales map but I just can’t see how to do this. Any help would be much appreciated.

A: 

do you mean you want some thing like Map, String> !!

Thn you can iterate over existing map and put reversed key values in a new map

Example:

Map<Set<String>, String> somemap = new HashMap<Set<String>, String>();
foreach(Map.entry entry : existingMap.entrySet()) {
  Set<String> value = entry.getValue();
  String key = entry.getKey();
  somemap.put(value,key);

}
I think he also wants to "transpose", with each of the Set<String> entries becoming their own key into a multimap of customer names. The result should still be a Map<String, Set<String>>.
Thilo
or maybe not, since he accepted your answer ;-)
Thilo
Well, if this is the correct answer, than the question is written wrong. This is definately not "each item purchased as a unique key"
Wouter Coekaerts
+2  A: 

I think it would be more of something like that:

Map<String,Set<String>> result = new HashMap<String,Set<String>>();
for (Map.Entry<String,Set<String>> entry: salesMap.entrySet()) {
    String cust = entry.getKey();
    Set<String> items = entry.getValue();
    for (String item: items) {
        Set<String> customers = result.get(item);
        if (customers == null) {
            customers = new HashSet<String>();
            result.put(item, customers);
        }
        customers.add(cust);
    }
}
Maurice Perry