需要帮助来简化解决方案



我正在学习Java并做一些与HashMap相关的操作。我正在尝试根据城市在哈希图中添加详细信息。所以假设下面是我们拥有的列表

List<Student> studentList= new LinkedList<>();
studentList.add(new Student(1, "Test1", "US"));
studentList.add(new Student(2, "Test2", "US"));
studentList.add(new Student(3, "Test3", "India"));
studentList.add(new Student(4, "Test4", "Canada"));
studentList.add(new Student(5, "Test5", "Canada"));
studentList.add(new Student(6, "Test6", "India"));

为此,我的输出如下所示:

{US=[Test1, Test2], India=[Test3, Test6], Canada=[Test4, Test5]}

我已经为此实现了代码,但它的时间复杂性非常高,因此正在寻找一些优化的解决方案。

private void getDetailsGroupByCity(List<Student> studentList)
{
Map<String,ArrayList<String>> studentHashMap= new HashMap<>();
List<Student> arrayList= new ArrayList<>(studentList);
List<String> names= new ArrayList<>();
Set<String> setKey= new HashSet<>();
for (Student student : arrayList) {
setKey.add(student.getCity());
}
for (String s : setKey) {
for (Student student : arrayList) {
if (s==student.getCity())
{
names.add(student.getName());
studentHashMap.put(s, (ArrayList<String>) names);
}
}
names= new ArrayList<>();
}
System.out.println(studentHashMap);
}

您只需浏览一次学生列表,并随时将每个学生分配到地图中的正确位置,从而得到 O(n( 解决方案:

Map<String, List<String>> studentHashMap = new HashMap<>();
for (Student s : studentList) {
studentHashMap.computeIfAbsent(s.getCity(), k => new ArrayList<>()).add(s.getName);
}

您也可以通过使用流来实现相同的结果,尽管我不确定这是否确实会更优雅:

Map<String, List<String>> studentMap =
studentList.stream()
.collect(Collectors.groupingBy(
Student::getCity,
Collectors.mapping(
Student::getName, 
Collectors.toList())));

相关内容

最新更新