【问题标题】:Sorting Map/TreeMap/LinkedHashMap by Value (custom data structures)按值排序 Map/TreeMap/LinkedHashMap(自定义数据结构)
【发布时间】:2016-02-23 22:09:15
【问题描述】:

我目前在尝试对Map<String, IncreaseDetails> 进行排序时遇到一些问题,其中IncreaseDetails 只是一个包含几个字段的自定义数据结构。

到目前为止,我已经相当清楚地理解,强烈建议不要使用 TreeMap,因为 TreeMap 应该按 KeySet 而不是实际值排序。

因此,我尝试同时切换到 HashMapLinkedHashMap,但只是调用

Collections.sort(map,comparator) 似乎无法解决问题。从 Java 8 开始,我就打算尝试使用 Stream API,但我不太了解它。

到目前为止,我的比较器如下所示:

import java.util.Comparator;
import java.util.Map;

public class CompTool implements Comparator<Float> {

    Map<String, IncreaseDetails> unsortedMap;

    public CompTool(Map<String, IncreaseDetails> unsortedMap)
    {
        this.unsortedMap = unsortedMap;
    }

    public int compare(Float countryOne, Float countryTwo)
    {
        Float countryOneValue = unsortedMap.get(countryOne).getRealIncrease();
        Float countryTwoValue = unsortedMap.get(countryTwo).getRealIncrease();
        return countryTwoValue.compareTo(countryOneValue);
    }

}

非常欢迎任何建议,因为我发现了很多类似的问题或视频,但对我目前的情况没有太大帮助。

【问题讨论】:

    标签: sorting collections java-8 java-stream


    【解决方案1】:

    您的问题有些不清楚。我假设您想按存储在getRealIncrease 中的值以相反的顺序对unsortedMap 条目进行排序。这可以通过创建原始映射条目流、排序并将结果收集到LinkedHashMap 中来完成,这会保留插入顺序:

    Map<String, IncreaseDetails> sortedMap = unsortedMap.entrySet()
               .stream()
               .sorted(Map.Entry.comparingByValue(
                    (Comparator.comparing(IncreaseDetails::getRealIncrease).reversed())))
               .collect(Collectors.toMap(
                    Map.Entry::getKey, 
                    Map.Entry::getValue,
                    (a, b) -> a,
                    LinkedHashMap::new));
    

    【讨论】:

    • 对不起,如果问题不太清楚。但无论如何,是的,这就是我想要的。非常感谢。
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 2012-08-10
    • 2023-03-10
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多