2015-04-01 2 views
0

Я создал объекты HashSet of Console, которые используют 2 строки. Один для названия компании для консоли, другой - имя консоли. У меня нет проблем с большинством основных методов (я знаю, как добавить к HashSet, очистить HashSet и т. Д.), Но у меня возникают проблемы с удалением одного объекта и с проверкой, содержит ли HashSet определенный объект , Я включил соответствующие фрагменты кода для класса HashSetПроблемы с объектами в HashSet

import java.util.HashSet; 

    public class testHashSet 
    { 
    private HashSet <Console> testSet; 

    /** 
    * Constructor 
    */ 
    public testHashSet() 
    { 
     testSet = new HashSet <Console>() ; 
     setTestSet(); 
    } 

    public void setTestSet(){ 
     testSet.add(new Console("Nintendo" , "Wii U")); 
     testSet.add(new Console("Sony" , "PS4")); 
     testSet.add(new Console("XBox" , "Microsoft")); 
    } 

    /** 
    * Method to remove object from HashSet 
    */ 
    public void removeData(){ 
     Console d = new Console("Sony" , "PS4"); 
     testSet.remove(d); 
     printHashSet(); 
    } 

    /** 
    * Method to check for specific object in HashSet 
    */ 
    public void checkForItem(String anyCompany, String anyConsole){ 
     boolean exist = testSet.contains(new Console (anyCompany, anyConsole)); 
     System.out.println(exist); 
    } 

Edit: Вот исходный код класса Console:

public class Console 
{ 
private String companyName; 
private String consoleName; 

/** 
* Constructor for objects of class Console 
*/ 
public Console(String anyCompany, String anyConsole) 
{ 
    companyName = companyName; 
    consoleName = anyConsole; 
} 

public void printConsoleInfo(){ 
    System.out.println(consoleName + " is a " + companyName + " console."); 
} 
} 
+4

Ваш класс консоли, вероятно, не переопределяет 'hashCode' и' equals'. – Misha

+0

Действительно - не видя кода для 'Console', мы не можем сказать, что случилось. Но да, это почти наверняка не отменяет «hashCode» и «равно» соответственно. –

+0

Хорошо, я просто добавил код. –

ответ

2

Вы не переопределяют hashCode() и equals() в вашем Console классе ,

Таким образом, вы получаете реализацию по умолчанию Java, которая рассматривает два экземпляра Console (и вы создаете новые экземпляры в своих методах), чтобы быть разными, даже если вы передаете одни и те же строки в конструктор.

Чтобы решить вашу проблему, вам необходимо «помочь» java идентифицировать равные объекты, реализовав собственный способ equals() в вашем классе Console. Чтобы соответствовать the general contract (и из-за того, как пытается найти элементы HashSet), вам также понадобится реализовать собственный метод hashCode().

Базовая реализация может, например, быть

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
      + ((companyName == null) ? 0 : companyName.hashCode()); 
    result = prime * result 
      + ((consoleName == null) ? 0 : consoleName.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Console other = (Console) obj; 
    if (companyName == null) { 
     if (other.companyName != null) 
      return false; 
    } else if (!companyName.equals(other.companyName)) 
     return false; 
    if (consoleName == null) { 
     if (other.consoleName != null) 
      return false; 
    } else if (!consoleName.equals(other.consoleName)) 
     return false; 
    return true; 
} 

(в порождена затмения)

Bonus: Если это не опечатка в вопросе, вы также хотите, чтобы изменить назначение в конструкторе от

companyName = companyName; 

к

companyName = anyCompany; 
Смежные вопросы