Java排序键值集合

时间:2017-12-21 22:30:03

标签: java sorting

我通常使用C#并且对Java API不是很熟悉,但这是我想要做的:

我有两个数组:

String[] names = concertNames.toArray(new String[concertNames.size()]);
Double[] rates = concertRates.toArray(new Double[concertRates.size()]);

names中的每个元素都对应rates中的元素,即names[i]的费率为rates[i]

我想获得N个顶级音乐会的名字。在C#中我会使用LINQ,在这里,我不确定。

编辑:偏离主题?你是认真的人吗?我知道如何对数组进行排序,我只是不想编写50行可怕的基本代码来做一件微不足道的事情。

3 个答案:

答案 0 :(得分:2)

我能想到的最好的方法是流式传输索引,按照费率对它们进行排序,然后将它们映射到它们的名称:

String[] topNames = 
    IntStream.range(0, rates.length)
             .boxed()
             .sorted(Comparator.comparing(i -> -1 * rates[i]))
             .limit(N)
             .map(i -> names[i])
             .toArray(String[]::new);

答案 1 :(得分:1)

考虑到names中的元素与rates中的元素之间存在关系,我建议您创建一个类来封装这两个字段,因此,更容易对对象进行排序根据费率并保持相关数据。

另一种选择是创建一个Map<String, Double>,其中每个名称都映射到相应的速率。

如果您决定继续创建自己的类来封装两个所述字段,那么您可以完成以下任务:

NameOfClass[] topRated = myList.stream()
                .sorted(Comparator.comparingDouble(NameOfClass::getRate).reversed())
                .limit(10) // Top N
                .toArray(NameOfClass[]::new);

如果您决定继续使用建议的Map方法,那么这样就足够了:

Map<String, Double> resultSet = myMap.entrySet()
       .stream()
       .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
       .limit(10) // Top N
       .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                         (oldValue, newValue) -> ... , LinkedHashMap::new));

答案 2 :(得分:0)

答案简短:http://www.jinq.org。 inq使得LINQ样式的查询可用于Java