3 回答
TA贡献1862条经验 获得超7个赞
如果您使用的是 Java8 或更高版本,请尝试以下操作:
mtutors.forEach((tutorName, subject) -> {
mstudents.forEach((studentName, subjects) -> {
if (subjects.contains(subject)) {
System.out.println(tutorName + ":" + studentName + ":" + subject);
}
});
});
我假设您将科目(不是学生)放到学生地图上。
仅获得第一次拟合的数据流示例。
mtutors.forEach((tutorName, subject) -> {
mstudents.entrySet().stream()
.filter(entry -> entry.getValue().contains(subject))
.findFirst()
.ifPresent(entry -> System.out.println(tutorName + ":" + entry.getKey() + ":" + subject));
});
TA贡献1906条经验 获得超10个赞
我的回答类似于@ŁukaszKucik 的回答,只是使用 Java 流。您可能不应该将我的解决方案用于您的作业,因为我想这不是您应该解决的方法。不过,只是为了多样化:
List<String> matches = mtutors.entrySet() .stream() .flatMap(tutor -> mstudents.entrySet() .stream() .filter(student -> student.getValue() .contains(tutor.getValue())) .map(student -> tutor.getKey() + " and " + student.getKey() + " - " + tutor.getValue())) .collect(Collectors.toList());
如果缺少的部分是list.contains():https ://www.tutorialspoint.com/java/util/arraylist_contains.htm
如果您缺少的部分是如何解决这种组合,那么仅仅在这里寻求解决方案并不是学习和家庭作业的工作方式。
TA贡献1790条经验 获得超9个赞
两个解决方案示例:
forEach Lambda - Java 8 或更高版本
经典
for循环
对未来的建议:
一个。不要直接使用类变量——而是根据 Java Bean 规范创建 getter/setter 对。然后使用它们:例如,改为tutors.get(i).lastName使用tutors.get(i).getLastName()
湾。for即使只有一行,在编写循环时也要使用大括号 - 它可以防止循环体出现意外的拼写错误。例如
for (int i = 0; i < students.size(); i++) {
mstudents.put(students.get(i).getFirstName() + " " + students.get(i).getLastName(), students.get(i).getSubjects());
}
代替
for (int i = 0; i < students.size(); i++)
mstudents.put(students.get(i).firstName + " " + students.get(i).lastName, students.get(i).subjects);
======================
package org.tempuri.tests;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
public class SimpleTest {
public static void main(String[] args) {
// Just for test - inbound data
Tutor mathTutor = new Tutor("Peter", "Parker", "MATH");
Tutor physicsTutor = new Tutor("Tonny", "Stark", "PHYSICS");
Tutor computersTutor = new Tutor("Steve", "Rogers", "COMPUTERS");
Student freshmen = new Student("Bill", "Gates", Arrays.asList("MATH", "COMPUTERS"));
Student sophomore = new Student("Peter", "Quill", Arrays.asList("MATH", "COMPUTERS", "PHYSICS"));
Student senior = new Student("Peggy", "Carter", Arrays.asList("MATH", "PHYSICS"));
List<Tutor> tutors = Arrays.asList(mathTutor, physicsTutor, computersTutor);
List<Student> students = Arrays.asList(freshmen, sophomore, senior);
// Untouched question code (almost ...)
HashMap<String, String> mtutors = new HashMap<>();
HashMap<String, List<String>> mstudents = new HashMap<>();
for (int i = 0; i < tutors.size(); i++)
mtutors.put(tutors.get(i).firstName + " " + tutors.get(i).lastName, tutors.get(i).subject);
for (int i = 0; i < students.size(); i++)
mstudents.put(students.get(i).firstName + " " + students.get(i).lastName, students.get(i).subjects);
// variation 1. using forEach Lambda (> Java 8)
List<MatchingPair> matchingPairs1 = new LinkedList<>();
mtutors.entrySet().forEach(tutorEntry -> {
mstudents.entrySet().forEach(studentEntry -> {
if (studentEntry.getValue().contains(tutorEntry.getValue()))
matchingPairs1
.add(new MatchingPair(tutorEntry.getKey(), studentEntry.getKey(), tutorEntry.getValue()));
});
});
System.out.println("result variation1: ");
System.out.println("------------------ ");
matchingPairs1.forEach(onePair -> System.out.println("Tutor: " + onePair.getTutorName() + " -> Student: "
+ onePair.getStudentName() + " -> Subject: " + onePair.getSubject()));
// variation 2. using classical for loops (< Java 7)
final List<MatchingPair> matchingPairs2 = new LinkedList<>();
for (Entry<String, String> oneTutor : mtutors.entrySet()) {
for (Entry<String, List<String>> oneStudent : mstudents.entrySet()) {
if (oneStudent.getValue().contains(oneTutor.getValue())) {
matchingPairs2.add(new MatchingPair(oneTutor.getKey(), oneStudent.getKey(), oneTutor.getValue()));
}
}
}
System.out.println("------------------ ");
System.out.println();
System.out.println("result variation2: ");
System.out.println("------------------ ");
for (MatchingPair onePair : matchingPairs2) {
System.out.println("Tutor: " + onePair.getTutorName() + " -> Student: " + onePair.getStudentName() + " -> Subject: "
+ onePair.getSubject());
}
System.out.println("------------------ ");
}
// supporting classes for test
private static class MatchingPair {
private String tutorName;
private String studentName;
private String subject;
MatchingPair(String tutorName, String studentName, String subject) {
this.tutorName = tutorName;
this.studentName = studentName;
this.subject = subject;
}
public String getTutorName() {
return tutorName;
}
public void setTutorName(String tutorName) {
this.tutorName = tutorName;
}
}
private static class Tutor {
String firstName;
String lastName;
String subject;
Tutor(String firstName, String lastName, String subject) {
this.firstName = firstName;
this.lastName = lastName;
this.subject = subject;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
private static class Student {
String firstName;
String lastName;
List<String> subjects;
Student(String firstName, String lastName, List<String> subjects) {
this.firstName = firstName;
this.lastName = lastName;
this.subjects = subjects;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public List<String> getSubjects() {
return subjects;
}
public void setSubjects(List<String> subjects) {
this.subjects = subjects;
}
}
}
添加回答
举报
