簡體   English   中英

如果我有ArrayList,如何比較兩個HashMap?

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

我無法繼續我的HashMap作業。 你能幫助我嗎?

我有2個HashMapmtutorsmstudents

mtutors鍵:他們的名字。
mtutors價值:一個主題。
mstudents密鑰:他們的名字。
mstudents值: mstudentsArrayList

我必須找到匹配的導師學生。 例如: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()

如果您缺少的是總體上如何解決這種結合的問題,那么這里只是要求解決方案不是學習和家庭作業的工作原理。

兩種解決方案示例:

  1. forEach Lambda-Java 8或更高版本
  2. 經典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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM