Как сравнить два HashMap, если у меня есть ArrayList? - PullRequest
0 голосов
/ 12 февраля 2019

Я не могу продолжить мою HashMap домашнюю работу.Вы можете мне помочь?

У меня есть 2 HashMap: mtutors и mstudents.

mtutors ключ: их имя.mtutors значение: предмет.mstudents ключ: их имя.mstudents значение: предметы (ArrayList)

Я должен найти подходящих студентов-репетиторов.Например: Один из ключей mtutors: Питер Паркер.Одно из значений mtutors: математика.один из ключей mstudents: Билл Гейтс.одно из значений mstudents: математика, IT.Подходящая пара: Питер Паркер и Билл Гейтс - математика.

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

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Мой ответ похож на ответ @ Ł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

Если ваш отсутствующий фрагмент был, как решить эту комбинацию в общем, тогда простопросить здесь решение не так, как работает обучение и домашняя работа.

0 голосов
/ 12 февраля 2019

пример двух решений:

  1. forEach Lambda - Java 8 или выше
  2. classic for loops

Рекомендации на будущее:

а.не используйте переменные класса напрямую - вместо этого создайте пары getts / setters в соответствии со спецификацией Java Bean.Затем используйте их: например, вместо tutors.get(i).lastName используйте tutors.get(i).getLastName()

b.при записи в цикл 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;
    }

}
}
0 голосов
/ 12 февраля 2019

Попробуйте следующее, если вы используете Java8 или выше:

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

Я предполагаю, что вы помещаете предметы (не ученики) в карту mstudents.

Пример с потоком данныхдля получения только первой подгонки.

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