2016-06-04 3 views
-3

Я работаю над hashmaps. Он не допускает дубликатов, но в этой программе он добавил три элемента в соответствии со мной, он должен добавить только один bcz-отдых.HashSet добавление дубликатов

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

Что это за класс 'WrappedString'? HashSet зависит от метода 'equals()', чтобы избежать дублирования. Если ваш класс не переопределяет это, тогда вы можете получить непредсказуемые результаты – zencv

+0

@zencv нет необходимости переопределять метод equals(), поскольку он уже доступен для всех классов, потому что этот метод определен в классе Object() –

+0

@DishaJain Exactly Object реализует equals и определяет, что эти два объекта не равны. – Paparazzi

ответ

0

Это происходит потому, что WrappedString не работает, как "нормальный" Строка. Затем я рекомендую вам использовать String.

Это вернуть ложные:

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

Это возвращающие:

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

Если результат возвращается ложным, HashSet будет добавить как новый элемент.

Или, если вы preffer не изменяетесь в строку, вы можете переопределить и равное HashSet из WrappedString определения, где разница, когда она будет сравнивать, делать что-то вроде этого:

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

В вашем вопросе :

System.out.println (hs.add (ws1)); // истинный

System.out.println (hs.add (ws2)) //// правда

System.out.println (hs.add (s1)); // истинный

Причина заключается в том, когда вы звоните add метод на HashSet, то element вы хотите добавить проверяется с существующими elements в Set с использованием equals() метода. Здесь ws1 не равен ws2, а также ни один из них не равен s1. Таким образом, вы видите true три раза.

+0

. Тогда в случае TreeSet, почему он не работает, public class Drink реализует Comparable { public String name; public int compareTo (Object o) { return 0; } @SuppressWarnings ("rawtypes") public static void main (String arg []) { \t Выпивка 1 = новый Напиток(); \t Пьете two = new Drink(); \t one.name = "Coffee"; \t two.name = "Tea"; \t TreeSet set = новый TreeSet(); \t System.out.println (set.add (one)); // true \t System.out.println (set.add (two)); // false } Здесь также должны быть вставлены оба эти объекта, поскольку они являются уникальными объектами –

 Смежные вопросы

  • Нет связанных вопросов^_^