Utilisez des clés composites dans Java Maps.

Aperçu

Pour utiliser une clé composite dans Java Map, spécifiez une classe qui contient tous les champs que vous souhaitez utiliser dans la clé composite de la clé Map. À ce stade, remplacez la méthode suivante de la classe utilisée pour la clé.

procédure

  1. Créez une classe contenant les champs que vous souhaitez utiliser pour la clé composite.
  2. Remplacez les méthodes equals et hashCode de la classe Object dont cette classe hérite implicitement.
  3. Spécifiez la classe créée dans la clé de la classe Map.

Exemple

Considérez la classe suivante qui contient des ventes et gérez cette classe avec une carte qui utilise une clé composite.

Champ de classe de vente
・ Numéro de magasin
・ Date de vente
・ Montant des ventes

Champs utilisés pour les clés composites
・ Numéro de magasin
・ Date de vente

(1) Créez une classe qui contient le champ que vous souhaitez utiliser pour la clé composée.

Classe de clé composite


package hoge;

import java.time.LocalDate;

/**Clé composite*/
public class CompositeKey {

	/**Numéro de magasin*/
	private final Integer shopNo;

	/**Date de vente*/
	private final LocalDate salesDate;

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

(2) Remplacez la méthode equals et la méthode hashCode de cette classe.

<Procédure lors de l'utilisation d'Eclipse>

  1. Ouvrez l'Explorateur de packages et sélectionnez la classe contenant la clé composite dans le champ.
  2. Cliquez sur Menu en haut de l'écran> Source (S)> "Générer hashCode () and equals () (H) ..."
  3. La boîte de dialogue "Generate hashCode () and equals ()" s'affiche. Appuyez sur OK.
  4. Les méthodes equals et hashCode sont insérées dans la classe de clé composite.

Puisque les méthodes equals et hashCode sont définies dans la classe Object, qui est la source d'héritage de toutes les classes, cette opération remplacera les méthodes de la classe Object.

○ Raison de la dérogation

・ égal à la méthode En remplaçant
, il sera jugé comme le même objet uniquement lorsque tous les champs correspondent. Si vous ne le remplacez pas, il ne sera pas comparé dans le contenu du champ, il ne peut donc pas être utilisé comme clé composite.

・ Méthode hashCode En remplaçant
, une valeur de hachage sera générée en fonction de la valeur de chaque champ.

Classe de clé composite avec equals () et hashCode () ajoutés

Classe de clé composite


package hoge;

import java.time.LocalDate;

/**Clé composite*/
package hoge;

import java.time.LocalDate;

/**Clé composite*/
public class CompositeKey {

	/**Numéro de magasin*/
	private final Integer shopNo;

	/**Date de vente*/
	private final LocalDate salesDate;

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

	/* (Non-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;
	}

	/* (Non-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;
	}
}

③ Contrôle de fonctionnement

<Scénario de test>

Stockez les données de vente dans HashMap et obtenez la valeur avec la clé composée.

○ Préparation

1. Préparez les données de test.
Numéro de magasin Date de vente Montant des ventes
1 2017/01/01 100
2 2017/01/02 200
3 2017/01/03 300
2. Créez une classe pour organiser des ventes.

Classe de vente


package hoge;

import java.time.LocalDate;

/**Record de ventes*/
public class SalesRecord {

	/**Numéro de magasin*/
	private final Integer shopNo;

	/**Date de vente*/
	private final LocalDate salesDate;

	/**Montant des ventes*/
	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;
	}

	/**pour le test*/
	@Override
	public String toString() {
		return "SalesRecord [storeNo=" + shopNo + ", salesDate=" + salesDate + ", sales=" + sales + "]";
	}
}
3. Créez une classe pour exécuter le test.

Classe principale


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

		//données de test
		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));

		//Générer HashMap
		Map<CompositeKey,SalesRecord> map = new HashMap<>();

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

		//Confirmez que la valeur peut être extraite de la clé.
		System.out.println(map.get(new CompositeKey(2,LocalDate.of(2017,1,2))));
	}
}

○ Mise en œuvre des tests

Essayez d'obtenir un enregistrement à partir des données sur le montant des ventes stockées dans HashMap avec la clé composite suivante.

Numéro de magasin Date de vente
2 2017/01/02

○ Résultat du test

console


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

Il a été confirmé que l'enregistrement spécifié pouvait être récupéré.

Exemple de code

・ GitHub Utiliser la clé composée dans Java Map

Le code créé pour les tests est stocké ci-dessus. Cependant, puisque le code publié inclut la classe Main, il peut également être exécuté par copier-coller.

Environnement de confirmation

Recommended Posts

Utilisez des clés composites dans Java Maps.
Utiliser OpenCV avec Java
Utiliser PreparedStatement en Java
[Java] Comment utiliser Map
Comment utiliser Java Map
Utilisons Twilio en Java! (Introduction)
Obtenir des valeurs de carte nulles en Java
[Java] N'utilisez pas "+" dans append!
JAVA (Carte)
Comment utiliser les classes en Java?
Utilisez-vous Stream en Java?
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 2-Programmation)
Carte en double triée par clé en Java
Inverser la clé de la valeur dans la carte Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Utilisez "Rhino" qui exécute JavaScript en Java
Changements dans Java 11
Janken à Java
[Java] Comparaison de cartes
[Java] Utilisez Collectors.collectingAndThen
Taux circonférentiel à Java
FizzBuzz en Java
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 1-Construire) (OpenCV-3.4.4)
[Java] Utilisation de final dans la déclaration de variable locale
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Lire JSON en Java
Faites un blackjack avec Java
Programmation par contraintes en Java
Mettez java8 dans centos7
Comment utiliser Map
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Commentaires dans la source Java
Comment utiliser la carte
[Java] API / carte de flux
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Fonctions Azure en Java
Formater XML en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Utilisez Interceptor au printemps
Hello World en Java
Enum Reverse Map Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Trier les valeurs de la carte par ordre croissant des clés dans Java TreeMap
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Bibliothèque de cartes bidirectionnelles Java
Art ASCII à Java
Comparer des listes en Java