2015-11-19 1 views
0

Je veux savoir comment vérifier les doublons dans la carte bidimensionnelle. La question est sur ce code exempleJava vérifier les doublons dans la carte bidimensionnelle

 Pair<Integer, String> pair1 = new Pair<Integer, String>(); 
     pair1.First = 1; 
     pair1.Second = "A"; 

     Pair<Integer, String> pair2 = new Pair<Integer, String>(); 
     pair2.First = 1; 
     pair2.Second = "A"; 

     Map<Pair<Integer, String>, Double> map 
           = new HashMap<Pair<Integer,String>, Double>(); 
     map.put(pair1, 0.0); 

     System.out.println(map.keySet().contains(pair2)); 
     System.out.println(map.containsKey(pair2)); 
     System.out.println(map.get(pair2)!=null); 

pourquoi la sortie:

false 
false 
false 

? Comment puis-je vérifier les doublons? Merci d'avance

+1

Pouvez-vous poster le code de votre classe Pair? Je soupçonne que ce n'est pas l'égalisation et le hashcode() – whaleberg

+0

import com.sun.star.beans.Pair; – Franky

+0

Hmn. Je n'arrive pas à trouver la source pour ça. Pouvez-vous l'afficher et voir si elle remplace equals() et hashCode? – whaleberg

Répondre

0

Je soupçonne que votre classe de paires ne définit pas correctement equals() et hashCode().

Si Pair est défini comme suit:

public class Pair<T, U>{ 
    T First; 
    U Second; 
} 

Vous verrez alors les résultats de votre obtenir. Par défaut, java utilise l'identité d'objet comme comparaison d'égalité, donc deux paires différentes seront inégales même si elles ont le même contenu. Vous pouvez remplacer equals et hashCode afin de fournir une comparaison plus significative.

public class Pair<T, U>{ 
    T First; 
    U Second; 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 

     Pair<?, ?> pair = (Pair<?, ?>) o; 

     if (First != null ? !First.equals(pair.First) : pair.First != null) { 
      return false; 
     } 
     return !(Second != null ? !Second.equals(pair.Second) : pair.Second != null); 

    } 

    @Override 
    public int hashCode() { 
     int result = First != null ? First.hashCode() : 0; 
     result = 31 * result + (Second != null ? Second.hashCode() : 0); 
     return result; 
    } 
} 

Cela produira lorsqu'il est utilisé avec votre code:

true 
true 
true 
0

Parce que vous utilisez implicitement la méthode pair1.equals(pair2) comparaison dans java.lang.Object classe. Ce qui est défini:

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true). (Java 8 API)

Depuis votre classe Pair ne remplace pas .hashCode() et .equals(Object other) méthodes => la comparaison x == y retour false.

Cela fonctionnerait:

public class NewClass { 
static class Pair<I,S>{ 
    private I First; 
    private S Second; 

    @Override 
    public int hashCode(){ 
     return First.hashCode() + 23*Second.hashCode(); 
    } 

    @Override 
    public boolean equals(Object other){ 
     Pair<I, S> otherPair = (Pair<I, S>) other; 
     return (this == null ? otherPair == null : (this.First == otherPair.First && this.Second == otherPair.Second)); 
    } 
} 
public static void main(String[] args) { 
    Pair<Integer, String> pair1 = new Pair<Integer, String>(); 
    pair1.First = 1; 
    pair1.Second = "A"; 

    Pair<Integer, String> pair2 = new Pair<Integer, String>(); 
    pair2.First = 1; 
    pair2.Second = "A"; 

    Map<Pair<Integer, String>, Double> map = new HashMap<Pair<Integer,String>, Double>(); 
    map.put(pair1, 0.0); 

    System.out.println(pair1.equals(pair2)); 
    System.out.println(map.containsKey(pair2)); 
} 
}