首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试按列表项对HashMap<String、List<String>>进行排序

尝试按列表项对HashMap<String、List<String>>进行排序
EN

Stack Overflow用户
提问于 2015-07-29 22:28:20
回答 3查看 1.3K关注 0票数 1

我有一个HashMap<String, List<String>>,但我不知道如何按第三个列表项对其进行排序。我试过使用比较器,但我可以让它看第三个列表项。

我正在使用的HashMap:

代码语言:javascript
复制
HashMap<String, List<String>> hmap= new HashMap<String, List<String>>();
List<String> prod1 = new ArrayList<String>();
prod1.add("123456789102");
prod1.add("3.0");
prod1.add("8");
hmap.put("Blue magazine", prod1);
List<String> prod2 = new ArrayList<String>();
prod2.add("123456789102");
prod2.add("2.0");
prod2.add("7");
hmap.put("Pink magazine", prod2);
List<String> prod3 = new ArrayList<String>();
prod3.add("123456789102");
prod3.add("1.0");
prod3.add("6");
hmap.put("Black magazine", prod3);

我试着把它从低到高(整数)排序到第二个列表项。所以:6-7-8

代码语言:javascript
复制
    List list = new LinkedList(map.entrySet());
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
        return ((Comparable) ((Map.Entry)(o1)).getValue()).compareTo(((Map.Entry)(o2)).getValue());
        }
    });

编辑:添加每个请求的比较器尝试。

EN

回答 3

Stack Overflow用户

发布于 2015-07-30 19:44:32

另一种方法不需要同时访问比较器中的listhmap,并生成排序映射:

代码语言:javascript
复制
List<Map.Entry<String,List<String>>> list = 
  new LinkedList<Map.Entry<String,List<String>>>(hmap.entrySet());

Collections.sort( list, new Comparator<Map.Entry<String,List<String>>>() {
    public int compare( Map.Entry<String,List<String>> o1,
                        Map.Entry<String,List<String>> o2) {
        return o1.getValue().get( 2 ).compareTo(  o2.getValue().get(2) );
    }
});

Map<String, List<String>> result = new LinkedHashMap<String, List<String>>();
for ( Map.Entry<String, List<String>> n : list )
    result.put( n.getKey(), n.getValue() );
票数 1
EN

Stack Overflow用户

发布于 2015-07-29 23:01:46

您是否考虑过在访问元素时对元素进行排序?

代码语言:javascript
复制
for (String key : hmap.keySet().stream()
  .sorted((o1,o2) -> hmap.get(o1).get(2).compareTo(hmap.get(o2).get(2)))
    .collect(Collectors.toList())){
            System.out.println(key);
        }

如果没有lambda,它看起来会是这样的

代码语言:javascript
复制
List<String> list = new ArrayList<>(hmap.keySet()); 
Collections.sort(list,new Comparator<String>(){ 
    public int compare(String o1, String o2) {
                        return hmap.get(o1).get(2).compareTo(hmap.get(o2).get(2));
                    } });

for (String key :list ){
   System.out.println(key);
}
票数 0
EN

Stack Overflow用户

发布于 2015-07-30 16:35:05

我最终解决这个问题的方法是手动排序并将键保存到一个单独的列表中。然后,当我稍后调用HashMap items时,我只需按顺序使用列表中的键。

代码语言:javascript
复制
public List<String> sortProducts(HashMap<String, List<String>> map) {
    HashMap<String, List<String>> preMap = map;
    List<String> sortedNames = new ArrayList<String>();
    while (preMap.size() > 0) {
        Integer currentLowest = 100;
        String currentLowestKey = null;
        for (String key: preMap.keySet()) {
            if (Integer.parseInt(map.get(key).get(2)) < currentLowest) {
                currentLowest = Integer.parseInt(map.get(key).get(2));
                currentLowestKey = key;
            }
        }
        sortedNames.add(currentLowestKey);
        preMap.remove(currentLowestKey);
        currentLowest = 100;
        currentLowestKey = null;
    }
    Collections.reverse(sortedNames);
    return sortedNames;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31703420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档