[英]I have two hashmap HashMap<String,List<String>> in this format how to compare both the values are same or not with same keys
[英]How to compare two HashMap if I have ArrayList?
我無法繼續我的HashMap
作業。 你能幫助我嗎?
我有2個HashMap
: mtutors
和mstudents
。
mtutors
鍵:他們的名字。
mtutors
價值:一個主題。
mstudents
密鑰:他們的名字。
mstudents
值: mstudents
( ArrayList
)
我必須找到匹配的導師學生。 例如:mtutors鍵之一:Peter Parker。 mtutors值之一:數學。 mstudents密鑰之一:Bill Gates。 mstudents值之一:math,IT。 配對:Peter Parker和Bill Gates-數學。
HashMap<String,String> mtutors = new HashMap<>();
HashMap<String,ArrayList> 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).students);
如果您使用的是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));
});
我的答案類似於@Ł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 : list.contains()
如果您缺少的是總體上如何解決這種結合的問題,那么這里只是要求解決方案不是學習和家庭作業的工作原理。
兩種解決方案示例:
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;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.