Verwenden Sie zusammengesetzte Schlüssel in Java Maps.

Überblick

Um einen zusammengesetzten Schlüssel in Java Map zu verwenden, geben Sie eine Klasse an, die alle Felder enthält, die Sie im zusammengesetzten Schlüssel im Map-Schlüssel verwenden möchten. Überschreiben Sie zu diesem Zeitpunkt die folgende Methode der für den Schlüssel verwendeten Klasse.

Verfahren

  1. Erstellen Sie eine Klasse, die die Felder enthält, die Sie für den zusammengesetzten Schlüssel verwenden möchten.
  2. Überschreiben Sie die Methoden equals und hashCode der Object-Klasse, die diese Klasse implizit erbt.
  3. Geben Sie die erstellte Klasse im Schlüssel der Map-Klasse an.

Beispiel

Betrachten Sie die folgende Klasse, die Verkäufe enthält, und verwalten Sie diese Klasse mit einer Map, die einen zusammengesetzten Schlüssel verwendet.

Verkaufsklassenfeld
・ Geschäftsnummer
・ Verkaufsdatum
・ Verkaufsbetrag

Felder für zusammengesetzte Schlüssel
・ Geschäftsnummer
・ Verkaufsdatum

(1) Erstellen Sie eine Klasse, die das Feld enthält, das Sie für den zusammengesetzten Schlüssel verwenden möchten.

Zusammengesetzte Schlüsselklasse


package hoge;

import java.time.LocalDate;

/**Zusammengesetzter Schlüssel*/
public class CompositeKey {

	/**Shop-Nummer*/
	private final Integer shopNo;

	/**Verkaufsdatum*/
	private final LocalDate salesDate;

	public CompositeKey(Integer storeNo, LocalDate salesDate) {
		this.shopNo = storeNo;
		this.salesDate = salesDate;
	}
}

(2) Überschreiben Sie die Methode equals und die Methode hashCode dieser Klasse.

  1. Öffnen Sie den Paket-Explorer und wählen Sie die Klasse mit dem zusammengesetzten Schlüssel im Feld aus.
  2. Klicken Sie oben auf dem Bildschirm auf Menü> Quelle (n)> "Hashcode generieren () und gleich () (H) ...".
  3. Der Dialog "HashCode () und gleich () generieren" wird angezeigt. Drücken Sie OK.
  4. Die Methoden equals und hashCode werden in die zusammengesetzte Schlüsselklasse eingefügt.

Da die Methoden equals und hashCode in der Object-Klasse definiert sind, die die Vererbungsquelle aller Klassen darstellt, überschreibt diese Operation die Methoden der Object-Klasse.

○ Grund für das Überschreiben

・ entspricht Methode Durch Überschreiben von
wird es nur dann als dasselbe Objekt beurteilt, wenn alle Felder übereinstimmen. Wenn Sie es nicht überschreiben, wird es nicht im Feldinhalt verglichen, sodass es nicht als zusammengesetzter Schlüssel verwendet werden kann.

・ hashCode-Methode Durch Überschreiben von
wird ein Hash-Wert basierend auf dem Wert jedes Felds generiert.

Zusammengesetzte Schlüsselklasse mit hinzugefügtem equals () und hashCode ()

Zusammengesetzte Schlüsselklasse


package hoge;

import java.time.LocalDate;

/**Zusammengesetzter Schlüssel*/
package hoge;

import java.time.LocalDate;

/**Zusammengesetzter Schlüssel*/
public class CompositeKey {

	/**Shop-Nummer*/
	private final Integer shopNo;

	/**Verkaufsdatum*/
	private final LocalDate salesDate;

	public CompositeKey(Integer storeNo, LocalDate salesDate) {
		this.shopNo = storeNo;
		this.salesDate = salesDate;
	}

	/* (Nicht-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((salesDate == null) ? 0 : salesDate.hashCode());
		result = prime * result + ((shopNo == null) ? 0 : shopNo.hashCode());
		return result;
	}

	/* (Nicht-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CompositeKey other = (CompositeKey) obj;
		if (salesDate == null) {
			if (other.salesDate != null)
				return false;
		} else if (!salesDate.equals(other.salesDate))
			return false;
		if (shopNo == null) {
			if (other.shopNo != null)
				return false;
		} else if (!shopNo.equals(other.shopNo))
			return false;
		return true;
	}
}

③ Funktionsprüfung

Speichern Sie Verkaufsdaten in HashMap und erhalten Sie den Wert mit dem zusammengesetzten Schlüssel.

○ Vorbereitung

1. Bereiten Sie die Testdaten vor.
Shop-Nummer Verkaufsdatum Verkaufszahlen
1 2017/01/01 100
2 2017/01/02 200
3 2017/01/03 300
2. Erstellen Sie eine Klasse für Verkäufe.

Verkaufsklasse


package hoge;

import java.time.LocalDate;

/**Verkaufsrekord*/
public class SalesRecord {

	/**Shop-Nummer*/
	private final Integer shopNo;

	/**Verkaufsdatum*/
	private final LocalDate salesDate;

	/**Verkaufszahlen*/
	private final Integer sales;

	public SalesRecord(Integer storeNo, LocalDate salesDate, Integer sales) {
		this.shopNo = storeNo;
		this.salesDate = salesDate;
		this.sales = sales;
	}

	public Integer getStoreNo() {
		return shopNo;
	}

	public LocalDate getSalesDate() {
		return salesDate;
	}

	public Integer getSales() {
		return sales;
	}

	/**zum Test*/
	@Override
	public String toString() {
		return "SalesRecord [storeNo=" + shopNo + ", salesDate=" + salesDate + ", sales=" + sales + "]";
	}
}
3. Erstellen Sie eine Klasse, um den Test auszuführen.

Hauptklasse


package hoge;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestMain {

	public static void main(String[] args) {

		//Testdaten
		List<SalesRecord> salesRecords = new ArrayList<>();
		salesRecords.add(new SalesRecord(1,LocalDate.of(2017,1,1),100));
		salesRecords.add(new SalesRecord(2,LocalDate.of(2017,1,2),200));
		salesRecords.add(new SalesRecord(3,LocalDate.of(2017,1,3),300));

		//Generieren Sie HashMap
		Map<CompositeKey,SalesRecord> map = new HashMap<>();

		for (SalesRecord record : salesRecords) {
			map.put(new CompositeKey(record.getStoreNo(), record.getSalesDate()), record);
		}

		//Bestätigen Sie, dass der Wert vom Schlüssel abgerufen werden kann.
		System.out.println(map.get(new CompositeKey(2,LocalDate.of(2017,1,2))));
	}
}

○ Implementierung testen

Versuchen Sie, mit dem folgenden zusammengesetzten Schlüssel einen Datensatz aus den in HashMap gespeicherten Verkaufsmengen zu erhalten.

Shop-Nummer Verkaufsdatum
2 2017/01/02

○ Testergebnis

Konsole


SalesRecord [storeNo=2, salesDate=2017-01-02, sales=200]

Es wurde bestätigt, dass der angegebene Datensatz abgerufen werden konnte.

Beispielcode

・ GitHub Verbundschlüssel in Java Map verwenden

Der zum Testen erstellte Code wird oben gespeichert. Da der veröffentlichte Code jedoch die Hauptklasse enthält, kann er auch durch Kopieren und Einfügen ausgeführt werden.

Bestätigungsumgebung

Recommended Posts

Verwenden Sie zusammengesetzte Schlüssel in Java Maps.
Verwenden Sie OpenCV mit Java
Verwenden Sie PreparedStatement in Java
[Java] Verwendung von Map
Verwendung von Java Map
Verwenden wir Twilio in Java! (Einführung)
Holen Sie sich null-sichere Map-Werte in Java
[Java] Verwenden Sie nicht "+" im Anhang!
JAVA (Karte)
Wie verwende ich Klassen in Java?
Verwenden Sie Stream in Java?
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 2-Programmierung)
Doppelte Karte sortiert nach Schlüssel in Java
Schlüssel vom Wert in Java Map umkehren
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Verwenden Sie "Rhino", das JavaScript in Java ausführt
Änderungen in Java 11
Janken in Java
[Java] Kartenvergleich
[Java] Verwenden Sie Collectors.collectingAndThen
Umfangsrate in Java
FizzBuzz in Java
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 1-Build) (OpenCV-3.4.4)
[Java] Verwendung von final in der lokalen Variablendeklaration
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
Lesen Sie JSON in Java
Machen Sie einen Blackjack mit Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
Verwendung von Map
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Kommentare in der Java-Quelle
Verwendung der Karte
[Java] Stream API / Map
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Azure funktioniert in Java
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Verwenden Sie Interceptor im Frühjahr
Hallo Welt in Java
Enum Reverse Map Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Sortieren Sie die Map-Werte in aufsteigender Schlüsselreihenfolge in Java TreeMap
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
Bidirektionale Java-Kartenbibliothek
ASCII-Kunst in Java
Listen in Java vergleichen