如何从地图中的列表中获取元素的数量?



到目前为止,我正在编写学生管理程序,并希望按课程数量降序和升序对课程进行排序。

学生.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())或完全删除该格式,因为它只是为了演示目的而添加的。

相关内容

  • 没有找到相关文章

最新更新