简体   繁体   English

如果我有ArrayList,如何比较两个HashMap?

[英]How to compare two HashMap if I have ArrayList?

I can not continue my HashMap homework. 我无法继续我的HashMap作业。 Can you help me? 你能帮助我吗?

I have 2 HashMap : mtutors and mstudents . 我有2个HashMapmtutorsmstudents

mtutors key: their name. mtutors键:他们的名字。
mtutors value: a subject. mtutors价值:一个主题。
mstudents key: their name. mstudents密钥:他们的名字。
mstudents value: subjects( ArrayList ) mstudents值: mstudentsArrayList

I have to find the matching tutor-students. 我必须找到匹配的导师学生。 For example: One of the mtutors key: Peter Parker. 例如:mtutors键之一:Peter Parker。 One of the mtutors value: math. mtutors值之一:数学。 one of the mstudents key: Bill Gates. mstudents密钥之一:Bill Gates。 one of the mstudents value: math,IT. mstudents值之一:math,IT。 Matching pair: Peter Parker and Bill Gates - math. 配对: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);

Try the following if you're using Java8 or higher: 如果您使用的是Java8或更高版本,请尝试以下操作:

mtutors.forEach((tutorName, subject) -> {
        mstudents.forEach((studentName, subjects) -> {
            if (subjects.contains(subject)) {
                System.out.println(tutorName + ":" + studentName + ":" + subject);
            }
        });
    });

I assume that you are putting subjects (not student) to mstudents map. 我假设您正在将科目(而非学生)放置到学生地图上。

Example with stream of data for getting only first fit. 数据流仅用于首次拟合的示例。

mtutors.forEach((tutorName, subject) -> {
        mstudents.entrySet().stream()
                .filter(entry -> entry.getValue().contains(subject))
                .findFirst()
                .ifPresent(entry -> System.out.println(tutorName + ":" + entry.getKey() + ":" + subject));
    });

My answer is similar to @ŁukaszKucik answer just with Java streams. 我的答案类似于@ŁukaszKucik的答案,只是Java流。 You probably shouldn't use my solution for your homework since I guess this is not how you are supposed to solve it. 您可能不应该将我的解决方案用于作业,因为我猜这不是您应该解决的方式。 Still, just for the sake of variety: 尽管如此,仅出于多样性考虑:

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());

If the missing piece was list.contains() : https://www.tutorialspoint.com/java/util/arraylist_contains.htm 如果缺少的是list.contains()https : list.contains()

If your missing piece was how to solve this combination in general then just asking here for a solution is not how learning and homework works. 如果您缺少的是总体上如何解决这种结合的问题,那么这里只是要求解决方案不是学习和家庭作业的工作原理。

two solutions example: 两种解决方案示例:

  1. forEach Lambda - Java 8 or higher forEach Lambda-Java 8或更高版本
  2. classic for loops 经典for循环

Recommendations for the future: 对未来的建议:

a. 一种。 do not use class variables directly - instead create getters/setters pairs according to Java Bean specification. 不要直接使用类变量-而是根据Java Bean规范创建getter / setter对。 Then use them: eg instead tutors.get(i).lastName use tutors.get(i).getLastName() 然后使用它们:例如,改为使用tutors.get(i).lastName使用tutors.get(i).getLastName()

b. when write for loop use curled brackets even if there is only one line - it prevents accidental typo mistakes with loop body. 当写循环时for即使只有一行,也要使用大括号-这可以防止循环体意外输入错误。 eg 例如

for (int i = 0; i < students.size(); i++) {
        mstudents.put(students.get(i).getFirstName() + " " + students.get(i).getLastName(), students.get(i).getSubjects());
    }

instead of 代替

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM