我已经创建了一个使用字符串作为键和使用整数作为值的地图。因此,就像citiesWithCodes

到目前为止,出于测试目的,我已经将值手动放入Hashmap中。他们是:

Map<String, Integer> citiesWithCodes = new HashMap<String, Integer>();
        citiesWithCodes.put("Berlin", 49);
        citiesWithCodes.put("Frankfurt", 49);
        citiesWithCodes.put("Hamburg", 49);
        citiesWithCodes.put("Cologne", 49);
        citiesWithCodes.put("Salzburg", 43);
        citiesWithCodes.put("Vienna", 43);
        citiesWithCodes.put("Zurich", 41);
        citiesWithCodes.put("Bern", 41);
        citiesWithCodes.put("Interlaken", 41);


我想根据城市代码以列表或数组格式获取城市。因此,例如对于值43,它应该返回类似{43=[Vienna, Salzburg]}的值。

我尝试了以下方法。这绝对是一种肮脏的方法,并且没有给出正确的结果。

   public static Map<Integer, List<String>> codeCities(Map<String, Integer> citiesWithCodes){
       Map<Integer, List<String>> segList = new HashMap<Integer, List<String>>();
       List<String> city;
       Iterator<Entry<String, Integer>> i = citiesWithCodes.entrySet().iterator();
       while (i.hasNext()) {
           city = new ArrayList<String>();
           Entry<String, Integer> next = i.next();
           i.remove();
           city.add(next.getKey());
           for (Entry<String, Integer> e : citiesWithCodes.entrySet()) {
               if(e.getValue().equals(next.getValue())){
                   city.add(e.getKey());
                   citiesWithCodes.remove(e);
               }
           }
           System.out.println(city);
           segList.put(next.getValue(), city);
       }
       return segList;
   }


我得到的输出是:{49=[Cologne], 41=[Interlaken], 43=[Salzburg]}
有人可以告诉我实现结果的正确方法吗?

PS:我知道可以使用MultiMap。但是我们仅限于使用Java Collection Framework,而不能使用Java 8。

最佳答案

如果您的范围仅限于Java 7,请尝试按以下代码进行更改:

 Map<Integer, List<String>> segList = new HashMap<Integer, List<String>>();
 Iterator<Entry<String, Integer>> i = citiesWithCodes.entrySet().iterator();
            while (i.hasNext()) {
                  Entry<String, Integer> next = i.next();
                  if (segList.get(next.getValue()) != null) {
                       List<String> city= segList.get(next.getValue());
                       city.add(next.getKey());
                       segList.put(next.getValue(), city);
                  }else{
                        List<String> city=new ArrayList<String>();
                        city.add(next.getKey());
                        segList.put(next.getValue(), city);

                  }
            }


输出:


  {49 = [法兰克福,柏林,汉堡,科隆],41 = [伯恩,苏黎世,
  因特拉肯],43 = [维也纳,萨尔茨堡]}

10-07 19:30
查看更多