Try MultiMaps.invertFrom ,
Example:
Multimap<String, Integer> map = HashMultimap.create(); map.put("a", 3); map.put("a", 4); map.put("a", 5); map.put("b", 5); map.put("b", 3); map.put("b", 6); Multimap<Integer,String> mapInverse=HashMultimap.create(); Multimaps.invertFrom(map, mapInverse); System.out.println(mapInverse);
Output:
{3=[b, a], 4=[a], 5=[b, a], 6=[b]}
Alternative solution:
Here I create a 2D Boolean array representing the company and their products for easy searching.
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.common.collect.TreeMultimap; public class ProductCompanyMap { private Multimap<String, String> companyProducts = TreeMultimap.create(); private boolean[][] ProductCompanyTable; private Map<String,Integer> productIndexMap = new HashMap<String, Integer>();; private Map<String,Integer> companyIndexMap = new HashMap<String, Integer>(); private String[] productArray; private String[] companyArray;; { companyProducts.put("Britania","Biscuts"); companyProducts.put("Britania","Soap"); companyProducts.put("Britania","Cloths"); companyProducts.put("MicroSoft","Software"); companyProducts.put("Birla","Cloths"); companyProducts.put("Birla","Software"); } public ProductCompanyMap(){ Set<String> companyNames=companyProducts.keySet(); Set<String> productNames= Sets.newTreeSet(companyProducts.values()); companyArray = companyNames.toArray(new String[companyNames.size()]); createIndexMap(companyIndexMap, companyArray); productArray = productNames.toArray(new String[productNames.size()]); createIndexMap(productIndexMap,productArray); ProductCompanyTable = new boolean[companyArray.length][productArray.length]; for(int i=0;i<companyArray.length;i++) for(int j=0;j<productArray.length;j++){ if(companyProducts.containsEntry(companyArray[i],productArray[j])) ProductCompanyTable[i][j] = true; } } private void createIndexMap(Map<String,Integer> map,String[] arr){ for(int i=0;i<arr.length;i++) map.put(arr[i], i); } public List<String> getProductsOfCompany(String companyName){ List<String> productsOfCompany = new ArrayList<String>(); Integer companyIndex = null; if((companyIndex=companyIndexMap.get(companyName))!=null) { for(int i=0;i<ProductCompanyTable[companyIndex].length;i++) if(ProductCompanyTable[companyIndex][i]) productsOfCompany.add(productArray[i]); } return productsOfCompany; } public List<String> getCompanysWithProduct(String productName){ List<String> companysWithProduct = new ArrayList<String>(); Integer productIndex = null; if((productIndex=productIndexMap.get(productName))!=null) { for(int i=0;i<ProductCompanyTable.length;i++) if(ProductCompanyTable[i][productIndex]) companysWithProduct.add(companyArray[i]); } return companysWithProduct; } public static void main(String[] args) { ProductCompanyMap mm=new ProductCompanyMap(); System.out.println("Products of Birla : " +mm.getProductsOfCompany("Birla")); System.out.println("Company producing cloths : "+mm.getCompanysWithProduct("Cloths")); } }
Emil
source share