Maison  >  Article  >  Java  >  Comment résoudre le problème java.lang.ClassCastException lors de l'utilisation de TreeMap en Java ?

Comment résoudre le problème java.lang.ClassCastException lors de l'utilisation de TreeMap en Java ?

王林
王林avant
2023-08-20 23:55:101089parcourir

Comment résoudre le problème java.lang.ClassCastException lors de lutilisation de TreeMap en Java ?

TreeMap est une classe de Java Collection Framework qui implémente l'interface NavigableMap. Il stocke les éléments de la carte dans une structure arborescente et constitue une alternative efficace au stockage des paires clé-valeur dans un ordre trié. Veuillez noter que lors de la création d'un objet TreeMap, il faut utiliser l'interface Comparable ou l'interface Comparator afin que nous puissions maintenir l'ordre de tri de ses éléments, sinon nous rencontrerons une java.lang.ClassCastException. Dans cet article, nous expliquerons comment utiliser les interfaces Comparable et Comparator pour résoudre les problèmes ClassCastException dans TreeMap.

Correction du problème java.lang.ClassCastException dans TreeMap

Commençons la discussion avec un exemple de programme qui nous montrera ClassCastException dans TreeMap.

La traduction chinoise de

Exemple 1

est :

Exemple 1

Dans l'exemple suivant, nous essaierons d'ajouter un objet de classe personnalisé à un TreeMap sans utiliser les interfaces Comparable et Comparator pour montrer la situation dans laquelle le compilateur Java lance java.lang.ClassCastException.

import java.util.*;
public class TrMap {
   String item;
   int price;
   TrMap(int price, String item) {
	// this keyword shows these variables belong to constructor
      this.item = item; 
      this.price = price;
   }
	// method for converting object into string
   public String toString() {
      return "Item: " + item + ", " + "Price: " + price;
   }
   public static void main(String[] args) {
      // Declaring collection TreeMap
     TreeMap<TrMap, Integer> obj = new TreeMap<>();
      // Adding object to the obj map
      obj.put(new TrMap(495, "TShirt"), 1);
      obj.put(new TrMap(660, "Shirt"), 2);
      // printing details obj map
      System.out.println("Elements of the map: " + obj);
   }
}
La traduction chinoise de

Output

est :

output

Exception in thread "main" java.lang.ClassCastException: class TrMap cannot be cast to class java.lang.Comparable (TrMap is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
	at java.base/java.util.TreeMap.compare(TreeMap.java:1569)
	at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776)
	at java.base/java.util.TreeMap.put(TreeMap.java:785)
	at java.base/java.util.TreeMap.put(TreeMap.java:534)
	at TrMap.main(TrMap.java:18)

Comment corriger l'erreur java.lang.ClassCastException à l'aide de l'interface comparable

Commençons la discussion en présentant l'interface Comparable

Interface comparable

Cette interface est très utile lorsque l'on souhaite trier des objets personnalisés dans l'ordre naturel. Par exemple, il trie les chaînes par ordre lexicographique et les nombres par ordre numérique. Cette interface est disponible dans le package 'java.lang'. Généralement, les classes et interfaces définies dans ce package sont disponibles par défaut, il n'est donc pas nécessaire d'importer explicitement ce package.

Grammaire

class nameOfclass implements Comparable<nameOfclass>

Ici, class est le mot-clé pour créer une classe, et Implements est le mot-clé pour activer les fonctionnalités fournies par l'interface.

compareTo() se traduit par :

L'interface Comparable ne définit qu'une seule méthode nommée 'CompareTo' qui peut être surchargée afin de trier la collection d'objets. Elle donne le pouvoir de comparer les objets d'une classe à elle-même. Elle renvoie 0 lorsque 'cet' objet est égal. à l'objet passé, une valeur positive si 'cet' objet est supérieur sinon une valeur négative.

Grammaire

compareTo(nameOfclass nameOfobject);
La traduction chinoise de

Exemple 2

est :

Exemple 2

L'exemple suivant démontre l'utilisation de Comparable pour corriger ClassCastException.

Méthode

  • Créez une classe 'TrMap' qui implémente l'interface Comparable. A l'intérieur de la classe, déclarez deux variables et définissez un constructeur avec deux paramètres de type chaîne et double 'item' et 'price'.

  • En allant plus loin, nous utiliserons la méthode 'toString()' pour convertir les données de l'objet en chaîne. Ensuite, définissez la méthode 'compareTo' et passez un objet de classe 'TrMap' comme paramètre pour comparer l'objet 'this' avec l'objet nouvellement créé.

  • Maintenant, dans la méthode main(), déclarez un objet de la classe TreeMap nommé 'obj' et stockez-y les détails de l'objet à l'aide de la méthode intégrée nommée 'put()'. « article » est la clé et sa valeur correspondante est « prix ».

  • Enfin, utilisez la méthode 'keySet()' dans une boucle for-each pour récupérer et imprimer la valeur associée à la clé.

import java.util.*;
import java.lang.*;
public class TrMap implements Comparable<TrMap> {
   String item;
   int price;
   TrMap(String item, int price) {
	// this keyword shows these variables belong to constructor
      this.item = item; 
      this.price = price;
   }
	// method for converting object into string
   public String toString() {
      return "Item: " + item + ", " + "Price: " + price;
   }
   public String getName() {
      return this.item;
   }
   // overriding method
   public int compareTo(TrMap comp) {
      return this.item.compareTo(comp.item);
   }
   public static void main(String[] args) {
      // Declaring collection TreeMap
      TreeMap<String, TrMap> obj = new TreeMap<>();
      // Adding object to the obj map
      TrMap obj1 = new TrMap("TShirt", 495);
      obj.put(obj1.getName(), obj1);
      TrMap obj2 = new TrMap("Shirt", 660);
      obj.put(obj2.getName(), obj2);
      TrMap obj3 = new TrMap("Kurti", 455);
      obj.put(obj3.getName(), obj3);
      // printing details obj map
      System.out.println("Elements of the map: ");
      for (String unKey : obj.keySet()) {
         System.out.println(obj.get(unKey));
      }
   }
}
La traduction chinoise de

Output

est :

output

Elements of the map: 
Item: Kurti, Price: 455
Item: Shirt, Price: 660
Item: TShirt, Price: 495

Comment résoudre le problème java.lang.ClassCastException à l'aide de Comparator

Tout d’abord, présentons l’interface Comparator.

Comparateur

Comme son nom l’indique, il est utilisé pour comparer quelque chose. En Java, Comparator est une interface permettant de trier des objets personnalisés. Nous pouvons écrire notre propre logique pour trier les objets spécifiés dans sa méthode intégrée nommée 'compare()'. Cette méthode accepte deux objets comme paramètres et renvoie une valeur entière. Grâce à cette valeur entière, le Comparateur détermine quel objet est le plus grand

Grammaire

class nameOfComparator implements Comparator< TypeOfComparator >() {
	compare( type object1, type object2 ) {
		// logic for comparison
	}
}    
La traduction chinoise de

Exemple 3

est :

Exemple 3

L'exemple ci-dessous montre l'utilisation de Comparator lors de la correction de ClassCastException.

Méthode

  • Tout d'abord, importez le package 'java.util' pour que nous puissions utiliser TreeSet

  • Créez une classe appelée « TrMap ». À l'intérieur de la classe, déclarez deux variables et définissez un constructeur qui a deux paramètres « article » et « prix », qui sont respectivement de type chaîne et de type entier.

  • En allant plus loin, nous utiliserons la méthode 'toString()' pour convertir les données de l'objet en chaîne

  • Ensuite, définissez une autre classe 'Comp' qui implémente l'interface Comparator et utilisez la méthode 'compare()' pour trier le TreeMap par ordre croissant.

  • Dans la méthode 'main()', créez une collection TreeMap en passant une instance de la classe 'Comp' pour le tri

    • Enfin, utilisez la méthode 'put()' pour stocker certains éléments dans la collection TreeMap, puis imprimez le résultat.

    import java.util.*;
    class TrMap {
       String item;
       int price;
       TrMap(int price, String item) {
    	// this keyword shows these variables belong to constructor
          this.item = item; 
          this.price = price;
       }
    	// method for converting object into string
       public String toString() {
          return "Item: " + item + ", " + "Price: " + price;
       }
       public String getName() {
          return this.item;
       }
    }
    // use of comparator interface
    class Comp implements Comparator<TrMap> {
       // logic to sort
       public int compare(TrMap i, TrMap j) {
          if(i.price > j.price) {
             return 1;
          } else {
             return -1;
          }
       }
    }
    public class Example2 {
       public static void main(String[] args) {
          // Declaring collection TreeMap
          TreeMap<TrMap, Integer> obj = new TreeMap<>(new Comp());
          // Adding object to the obj map
          obj.put(new TrMap(495, "TShirt"), 1);
          obj.put(new TrMap(660, "Shirt"), 2);
           // printing details obj map
          System.out.println("Elements of the map: " + obj);
       }
    }
    

    Output

    的中文翻译为:

    输出

    Elements of the map: {Item: TShirt, Price: 495=1, Item: Shirt, Price: 660=2}
    

    结论

    在本文中,我们首先定义了TreeMap类,然后介绍了TreeMap中的ClassCastException。在下一部分中,我们讨论了可以帮助解决这个ClassCastException的Comparator和Comparable接口。然后,我们看到了三个示例程序,展示了ClassCastException以及如何修复这个异常。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer