[Java] Konvertiere 1 in N Liste in Karte

Einführung

Wenn Sie beispielsweise das Ergebnis verarbeiten möchten, das durch Verknüpfen von zwei übergeordneten und untergeordneten Tabellen aus der Datenbank für jeden Schlüssel extrahiert wurde. Sie können es als Liste verarbeiten, aber es sieht besser aus, wenn Sie es nach Schlüssel gruppieren, oder? (Ich persönlich mag es, weil es die Lesbarkeit verbessert. Wenn es ein Leistungsproblem gibt, kann es nicht behoben werden.) Versuchen Sie diesmal nach der Stapelerfassung mit einer nebeneinander angeordneten Liste, in Map zu konvertieren (Schlüssel: übergeordnete Tabelle, Wert: untergeordnete Tabelle).

Annahme

ER

Abteilungsleiter

Mitarbeiterstamm

--Mitarbeiter-ID --Mitarbeitername

Wenn Sie dies durch innere Verbindung erhalten, wird es so sein. ↓

select_all.sql


select *
vom Abteilungsleiter
Inner Join Mitarbeiter Master mit Abteilungs-ID;

Bild des Erfassungsergebnisses (Liste ) ↓

Abteilung Mitarbeiter
Abteilung 1 Mitarbeiter 1
Abteilung 1 Mitarbeiter 2
Abteilung 2 Mitarbeiter 3
Abteilung 2 Mitarbeiter 4
Abteilung 2

Der Zweck dieser Zeit besteht darin, dies in "Map <Abteilung, Liste >" mit der Abteilung als Schlüssel und dem Mitarbeiter als Wert umzuwandeln.

Implementierung

Umgebung

Was ich gemacht habe

--DemoService: Hauptprozess --DbMapper: Eigentlich ein OR-Mapper wie Mybatis. --DbMapperImpl: DbMapper zum Testen implementiert. --Ergebnis: Speichern Sie das Ergebnis von select_all.sql

Serviceklasse

Zur Zeit habe ich zwei list2Map7-Methoden der Version ** Java7 ** und ** Java8 (Stream API) ** erstellt. Die Ergebnisse sollten für beide gleich sein. Immerhin hat die Implementierung mit der Stream-API eine kleine Menge Code und ist leicht zu sehen. Ich möchte nichts implementieren, was nichts mit Geschäftslogik zu tun hat. Wenn Sie Ihr Bestes geben, ist list2Map8 möglicherweise leichter zu sehen. Es scheint jedoch, dass weniger lesbarer Code zusätzlich zur Service-Klasse zunimmt.

DemoService.java


package com.example.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class DemoService {

	@Autowired
	DbMapper mapper;

	public void execute(String[] args) {
		log.info("### START ###");
		// select from DB
		List<Result> list = mapper.select();
		//Extrahierter Inhalt
		list.forEach(System.out::println);
		// List ⇒ LinkedHashMap
		Map<Department, List<Employee>> map = list2Map8(list);
		System.out.println();
		//Ergebnis der Ausgabekonvertierung
		for (Map.Entry<Department, List<Employee>> entry : map.entrySet()) {
			System.out.println("Key:" + entry.getKey());
			entry.getValue().forEach(e -> System.out.println("    Value:" + e));
		}
		log.info("### END ###");
	}

	/**
	 *List⇒Map-Konvertierung(java7Ver).
	 * 
	 * @param list
	 * @return
	 */
	private Map<Department, List<Employee>> list2Map7(List<Result> list) {
		if (list.isEmpty()) {
			return Collections.emptyMap();
		}
		Map<Department, List<Employee>> map = new LinkedHashMap<>();
		//Letzter Schlüssel
		Department prevDep = null;
		List<Employee> tempList = null;
		for (Result result : list) {
			Department dep = result.getDepartment();
			//Wenn sich der Schlüssel ändert
			if (!dep.equals(prevDep)) {
				//Liste der Werte initialisieren
				tempList = new ArrayList<>();
				//Zur Karte hinzugefügt, wobei die Werte initialisiert wurden(Referenz auf Karte setzen)
				map.put(dep, tempList);
				//Verwenden Sie diesen Schlüssel als vorherigen Schlüssel
				prevDep = dep;
			}
			//Fügen Sie tempList einen Wert hinzu, der auf die Map verweist
			tempList.add(result.getEmployee());
		}
		return map;
	}

	/**
	 *List⇒Map-Konvertierung(java8Ver).
	 * 
	 * @param list
	 * @return
	 */
	private Map<Department, List<Employee>> list2Map8(List<Result> list) {
		// List(Wert)⇒Map(キー、Wert)Umstellung auf
		Map<Department, List<Employee>> ret = list.stream()
				.collect(Collectors.groupingBy(Result::getDepartment,
				LinkedHashMap::new, Collectors.mapping(Result::getEmployee, Collectors.toList())));
		return ret;
	}
}

Ich verwende ** LinkedHashMap **, um die Akquisitionsreihenfolge beizubehalten. Es wird in HashMap nicht beibehalten. (Vielen Dank für Ihren Kommentar und die Verbesserung der Konvertierungsmethode.)

DbMapper-Schnittstelle

Eigentlich fühlt es sich an, als würde man Mybatis oder OR Mapper verwenden.

DbMapper.java


package com.example.demo;

import java.util.List;
import org.springframework.stereotype.Component;

@Component
public interface DbMapper {
	List<Result> select();
}

DbMapperImpl-Klasse

Gibt Daten zum Debuggen zurück.

DbMapperImpl.java


package com.example.demo;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Component;

@Component
public class DbMapperImpl implements DbMapper {
	@Override
	public List<Result> select() {
		List<Result> list = new ArrayList<>();
		list.add(getResult(1, 101));
		list.add(getResult(1, 102));
		list.add(getResult(2, 203));
		list.add(getResult(3, 304));
		list.add(getResult(3, 305));
		list.add(getResult(3, 306));
		return list;
	}

	private Result getResult(int did, int eid) {
		Department department = new Department();
		department.setDepartmentId(did);
		department.setDepartmentName("System" + did + "Teilung");

		Employee employee = new Employee();
		employee.setEmployeeId(eid);
		employee.setName("Yamada" + eid + "Ro");
		employee.setDepartmentId(department.getDepartmentId());

		Result result = new Result(department, employee);
		return result;
	}
}

Ergebnisklasse

Das Objekt, in dem das SELECT-Ergebnis aus der DB zuerst gespeichert wird.

Result.java


package com.example.demo;

import lombok.Data;

@Data
public class Result {
	private Department department;
	private Employee employee;

	public Result() {
	}

	public Result(Department department, Employee employee) {
		this.department = department;
		this.employee = employee;
	}
}

Abteilungsklasse

Abteilungsleiter. Lomboks @Data überschreibt den Hashcode und ist gleich. Gleiches gilt für den Mitarbeiterstamm. Je nach Situation ist PK das einzige zu überschreibende Feld, wenn dies tatsächlich einen Datensatz in der Tabelle darstellt. Erstellen Sie in diesem Fall Ihre eigenen, ohne @Data zu verwenden. Override ist erforderlich, da LinkedHashMap (HashMap) verwendet wird.

Department.java


package com.example.demo;

import lombok.Data;

@Data
public class Department {
	private Integer departmentId;
	private String departmentName;
}

Mitarbeiterklasse

Mitarbeiterstamm.

Employee.java


package com.example.demo;

import lombok.Data;

@Data
public class Employee {
	private Integer employeeId;
	private String name;
	private Integer departmentId;
}

Ausführungsergebnis

Es wird für jeden Schlüssel (jede Abteilung) ordnungsgemäß in eine Karte konvertiert.

Ausführungsergebnis


Result(department=Department(departmentId=1, departmentName=Systemabschnitt 1), employee=Employee(employeeId=101, name=Yamada 101ro, departmentId=1))
Result(department=Department(departmentId=1, departmentName=Systemabschnitt 1), employee=Employee(employeeId=102, name=102ro Yamada, departmentId=1))
Result(department=Department(departmentId=2, departmentName=Systemabschnitt 2), employee=Employee(employeeId=203, name=Yamada 203ro, departmentId=2))
Result(department=Department(departmentId=3, departmentName=Systemabschnitt 3), employee=Employee(employeeId=304, name=Yamada 304ro, departmentId=3))
Result(department=Department(departmentId=3, departmentName=Systemabschnitt 3), employee=Employee(employeeId=305, name=Yamada 305ro, departmentId=3))
Result(department=Department(departmentId=3, departmentName=Systemabschnitt 3), employee=Employee(employeeId=306, name=Yamada 306ro, departmentId=3))

Key:Department(departmentId=1, departmentName=Systemabschnitt 1)
    Value:Employee(employeeId=101, name=Yamada 101ro, departmentId=1)
    Value:Employee(employeeId=102, name=102ro Yamada, departmentId=1)
Key:Department(departmentId=2, departmentName=Systemabschnitt 2)
    Value:Employee(employeeId=203, name=Yamada 203ro, departmentId=2)
Key:Department(departmentId=3, departmentName=Systemabschnitt 3)
    Value:Employee(employeeId=304, name=Yamada 304ro, departmentId=3)
    Value:Employee(employeeId=305, name=Yamada 305ro, departmentId=3)
    Value:Employee(employeeId=306, name=Yamada 306ro, departmentId=3)

Nachwort

Lombok ist praktisch, nicht wahr?

Recommended Posts

[Java] Konvertiere 1 in N Liste in Karte
Für Java-Anfänger: Liste, Karte, Iterator / Array ... Wie konvertiere ich?
[Java] [ibatis] So erhalten Sie 1-zu-N-Beziehungsdatensätze mit List <Map <>>
[Java] Verwendung von Map
Verwendung von Java Map
So konvertieren Sie Java Base
[Java] Konvertiert ArrayList in Array
Beispielcode zum Konvertieren von List in List <String> in Java Stream
Gelernter Stream (Ich möchte List in Map <Integer, List> konvertieren)
Karte <K, V1> in Karte <K, V2> konvertieren (Kartenwert konvertieren)
JAVA (Karte)
[Java] Verwendung von List [ArrayList]
[Android] Konvertieren Sie Android Java-Code in Kotlin
[Java] Konvertierung von Array zu Liste
Java8-Listenkonvertierung mit Stream Map
[Java] Konvertieren Sie ein Array in ArrayList * Achtung
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
[Java] Listen- / Kartenelemente mit Iterator abrufen
[Java] Hinzufügen von Daten zur Liste (add, addAll)
Konvertieren Sie alle Android-Apps (Java) in Kotlin
Konvertieren Sie von der Java-UTC-Zeit in die JST-Zeit
[Java] Konvertiert Null vom Objekttyp in String-Typ
Ändern Sie die Liste <Optional <T >> in Java in Optional <Liste <T >>
Konvertieren Sie SVG-Dateien in Java in PNG-Dateien
[Java] Map # Merge ist schwer zu verstehen.
Liste, Set, Karte
Java Memorandum (Liste)
Klonen Sie die Java-Liste.
Array / Liste / Karte
[Java] Kartenvergleich
[Java] Einführung in Java
Einführung in Java
[Java] Von zwei Listen zu einer Array-Liste
[Java] Konvertieren Sie DB-Code mit enum in einen Codewert
Konvertieren Sie Json so wie es ist in List <T>
Konvertieren Sie verschachtelte Java-Beans in das Format aaa.bbb [0] .ccc
Starten Sie Docker von Java aus, um Office-Dokumente in PDF zu konvertieren
<java> Zip-Datei lesen und direkt in String konvertieren
[Java] PDF-Version konvertieren
Beherrschen von Kotlin ~ Konvertieren von Java-Dateien in Kotlin-Dateien Road to Graduation ~ Teil 3
Konvertieren Sie Java Enum Enumeration und JSON von und nach Jackson
Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang-
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Verwendung von Map
java: Wie schreibe ich eine generische Typliste? [Hinweis]
[Java] Konvertieren Sie Zeichenfolgen in Groß- / Kleinschreibung (AOJ⑨ - Swap in Groß- / Kleinschreibung)
[Java] Stellen Sie eine Verbindung zu MySQL her
Informationen zur Java-Array-Liste
Kotlins Verbesserungen an Java
Java-Anwendungen konvertieren Word-Dokumente (DOC / DOCX) in PDF
Von Java zu Ruby !!
Bidirektionale Java-Kartenbibliothek
Beherrschen von Kotlin ~ Konvertieren von Java-Dateien in Kotlin-Dateien Road to Graduation ~ Teil 1
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java