到目前为止,我正在编写学生管理程序,并希望按课程数量降序和升序对课程进行排序。
学生.class挥舞着一份清单,我将学生存储在其中。应该看起来像这样。
public class courses{
Coursenumber coursenumber;
int grade;
Teacher teacher;
List<Student> listOfStudentsInCourse = new ArrayList<>();
}
我将该列表放在地图中,以便更轻松地访问键值对。
TreeMap<Coursenumber, Course> showAllCoursesMap = new TreeMap<>();
Course testCourse1 = new Klasse(
new Coursenumber("XYZ"),
grade 5,
mrLee);
Course testCourse1 = new Klasse(
new Coursenumber("XYZ"),
grade 5,
mrSmith);
我使用 put-method在showAllCoursesMap中添加了它们。输出应如下所示
testcourse1 number of students: 2
testcourse2 number of students: 1
您可以使用Stream API for Java>= Java 8。 本质上,您要做的是基于 Map 值进行一些排序。因此,我们使用sorted
流式传输地图,并使用Map.Entry.comparingByValue()
根据值进行比较。此方法采用Comparator
我们可以通过以下方式提供Comparator.comparingInt()
.然后,我们只需要告诉comparingInt()
我们要比较的关键是什么。在您的情况下,这是列表的长度,因此您需要获取列表及其大小。最后但并非最不重要的是在列表中收集结果。
如果希望列表按相反顺序排序,请添加Collections.reverseOrder()
。
这里有一个最小的例子,展示了如何做到这一点。在我的情况下,结果将是List<Map.Entry<Integer, Application.Wrapper>>
型。如果您只想要实际值的列表(在我的情况下List<Application.Wrapper>
),则需要在toList()
之前插入.map(Map.Entry::getValue)
import java.util.*;
public class Application {
public static void main(String[] args) {
var test = new TreeMap<Integer, Wrapper>();
test.put(1, new Wrapper(List.of(1, 2, 3, 4, 5, 6)));
test.put(2, new Wrapper(List.of(1, 2, 3, 4)));
test.put(3, new Wrapper(List.of(1, 2)));
test.put(4, new Wrapper(List.of(1, 2, 3, 4, 5, 6, 7, 8, 9)));
// sort in ascending order (default)
var resultAscending = test
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.comparingInt(wrapper -> wrapper.getSomeList().size())))
.toList();
// sort in descending order
var resultDescending = test
.entrySet()
.stream()
// only change here: Collections.reverseOrder()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue(Comparator.comparingInt(wrapper -> wrapper.getSomeList().size()))))
.toList();
System.out.println(resultAscending);
System.out.println(resultDescending);
}
static class Wrapper {
List<Integer> someList;
public Wrapper(List<Integer> someList) {
this.someList = someList;
}
public List<Integer> getSomeList() {
return someList;
}
@Override
public String toString() {
return someList + " (Size: %d)".formatted(someList.size());
}
}
}
预期产出
[3=[1, 2] (Size: 2), 2=[1, 2, 3, 4] (Size: 4), 1=[1, 2, 3, 4, 5, 6] (Size: 6), 4=[1, 2, 3, 4, 5, 6, 7, 8, 9] (Size: 9)]
[4=[1, 2, 3, 4, 5, 6, 7, 8, 9] (Size: 9), 1=[1, 2, 3, 4, 5, 6] (Size: 6), 2=[1, 2, 3, 4] (Size: 4), 3=[1, 2] (Size: 2)]
请注意:
toString()
方法使用从 Java 15 开始可用的formatted()
,因此如果您没有该方法,请使用String.format(" Size: (%d)", someList.size())
而不是" (Size: %d)".formatted(someList.size())
或完全删除该格式,因为它只是为了演示目的而添加的。