2016-06-04 18 views
-3

Ich arbeite an Hashmaps. Es erlaubt keine Duplikate, aber in diesem Programm hat es drei Elemente hinzugefügt, nach mir sollte es nur einen bcz Rest hinzufügen sind gleich.HashSet Hinzufügen von Duplikaten

import java.util.*; 
public class WrappedString { 
private String s; 
public WrappedString(String s) { this.s = s; } 
public static void main(String[] args) { 
    HashSet<Object> hs = new HashSet<Object>(); 
    WrappedString ws1 = new WrappedString("aardvark"); 
    WrappedString ws2 = new WrappedString("aardvark"); 
    String s1 = new String("aardvark"); 
    String s2 = new String("aardvark"); 
    System.out.println(hs.add(ws1)); //true 
    System.out.println(hs.add(ws2)); ////true 
    System.out.println(hs.add(s1)); //true 
    System.out.println(hs.add(s2)); //false 
    System.out.println(hs.size());//3 } } 
+0

Was ist diese Klasse 'WrappedString'? HashSet hängt von der Methode 'equals()' ab, um Duplikate zu vermeiden. Wenn Ihre Klasse das nicht überschreibt, erhalten Sie möglicherweise unvorhersehbare Ergebnisse. – zencv

+0

@zencv Es besteht keine Notwendigkeit, die equals() -Methode zu überschreiben, da sie bereits für alle Klassen verfügbar ist, da diese Methode in Object() - Klasse –

+0

@DishaJain Exactly Object definiert ist implementiert gleich und bestimmt, dass diese beiden Objekte nicht gleich sind. – Paparazzi

Antwort

0

Es geschah, weil WrappedString nicht wie "normale" String arbeiten. Dann empfehle ich Ihnen, String zu verwenden.

Es wird return false:

new WrappedString("test").equals(new WrappedString("test")) 

Es wird return true:

new String("aardvark").equals(new String("aardvark")) 

Wenn das Ergebnis falsch zurückgegeben, die HashSet wie ein neues Element hinzufügen.

Oder, wenn Sie preffer nicht zu String ändern, können Sie die Gleichen außer Kraft setzen und Hashset von WrappedString bestimmen, wo Unterschied ist, wenn es verglichen wird, so etwas wie dies zu tun:

public class WrappedString { 
    private String s; 

    public WrappedString(String s) { 
    this.s = s; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     WrappedString ws = (WrappedString)obj; 
     return this.s.equals(ws.s); 
    } 
    @Override 
    public int hashCode() { 
     return this.s.hashCode(); 
    } 
} 
0

In Ihrer Frage :

System.out.println (hs.add (ws1)); // true

System.out.println (hs.add (WS 2)); //// wahr

System.out.println (hs.add (s1)); // true

Der Grund dafür ist, wenn Sie add Methode auf HashSet nennen, die element Sie mit bestehenden elements des Set mit equals() Methode hinzufügen möchten geprüft. Hier ist ws1 nicht gleich ws2 und auch keiner von ihnen ist ungleich s1. So sehen Sie true dreimal.

+0

Dann im Falle von TreeSet, warum es nicht funktioniert öffentliche Klasse Drink implementiert Vergleichbar { public String name; public int compareTo (Objekt 0) { return 0; } @SuppressWarnings ("rawtypes") public static void main (String arg []) { \t Getränk ein Getränk = new(); \t Getränk zwei = neues Getränk(); \t one.name = "Kaffee"; \t two.name = "Tee"; \t TreeSet set = new TreeSet(); \t System.out.println (set.add (eins)); // true \t System.out.println (set.add (zwei)); // false } Hier sollten auch beide eingefügt werden, da sie eindeutige Objekte sind –