按值排序Map / TreeMap / LinkedHashMap(自定义数据结构)

时间:2015-11-21 12:25:29

标签: sorting collections java-8 java-stream

我目前在尝试对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);
    }

}

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

1 个答案:

答案 0 :(得分:1)

你的问题有点不清楚。我假设您要按unsortedMap中相反的顺序排列getRealIncrease条目。这可以通过创建原始地图条目流,将结果排序并收集到保留插入顺序的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));