试试MultiMaps.invertFrom,
示例:
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);
输出:
{3=[b, a], 4=[a], 5=[b, a], 6=[b]}
替代解决方案:
在这里,我创建了一个代表公司及其产品的二维布尔数组,以便于查找。
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's producing cloths : "+mm.getCompanysWithProduct("Cloths"));
}
}