我通常使用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行可怕的基本代码来做一件微不足道的事情。
答案 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