Не удается сохранить объект в HashMap - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать SecureDataContainer с таким определением HashMap: HashMap: ()>
Где KeyCouple - это определенный мной класс, который содержит пару для доступа к вектору, связанному с этой парой. Теперь, когда я создаю пару HashMap в этом методе

private Map<KeyCouple,Vector<E>> DBUsers;

public void createUser(String Id, String passw) throws 
     UserAlreadyPresent {
     if(Id.isEmpty() || passw.isEmpty()) throw new IllegalArgumentException();
     if(existsUser(Id)) throw new UserAlreadyPresent(Id);

     KeyCouple u = new KeyCouple(Id, passw);
     DBUsers.put(u, new Vector<>());
}

Теперь в основном классе я запускаю следующий код:

private static void testContainer(SecureDataContainer<String> container){
    try {
            container.createUser("Name","pwd");
    } catch (UserAlreadyPresent e) {
            System.out.println("User already present");
    }
...

Создать пользователя «Имя» с паролем «pwd». Но когда я помещаю что-то в вектор, связанный с парой, созданной с помощью моего метода «put»:

public boolean put(String Owner, String passw, E data) throws NoUserException {
    if(Owner == null || passw == null || data == null) throw new NullPointerException();
    if(Owner.isEmpty() || passw.isEmpty()) throw new IllegalArgumentException();

    KeyCouple user = new KeyCouple(Owner,passw);
    if(DBUsers.containsKey(user)){
        Vector<E> aux = DBUsers.get(user);
        return aux.add(data);
    }else{
        throw new NoUserException("No user");
    }
}

В основном классе я вызываю метод:

    try {
        container.put("Name", "pwd", someData of type E);
    } catch (NoUserException e){
        abort("no user");
    }

и он прерывается в каждом случае, даже в ветви catch и печатая «no user».

Что это значит?

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

Вам потребуется перезаписать методы равенства и хэш-кода KeyCouple.

Я бы посоветовал вам использовать любую среду IDE для их автоматической генерации.

KeyCouple user = новая KeyCouple (Владелец, пароль);

Это создает новый пользовательский объект, и вы вставляете его в карту. И в следующий раз, когда вы создаете еще один новый объект (который никогда не будет равен уже созданному объекту, если вы явно не переопределите equals / hashcode).

Пожалуйста, обратитесь к этому для дальнейшего объяснения.

Почему мне нужно переопределить методы equals и hashCode в Java?

0 голосов
/ 09 ноября 2018

Вы можете проверить пример класса KeyCouple с помощью равенства и хеш-кода.

public class KeyCouple {   

    private String name;    

    private String pwd;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        KeyCouple keyCouple = (KeyCouple) o;
        return Objects.equals(name, keyCouple.name) &&
                Objects.equals(pwd, keyCouple.pwd);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, pwd);
    }
}
0 голосов
/ 09 ноября 2018

каждое использование new создает новый объект в куче. хотя вы сохранили один экземпляр KeyCouple в качестве ключа в хэш-карте, вы пытаетесь сопоставить его с другим экземпляром KeyCouple. хеш-код, сгенерированный для каждого экземпляра пользователя, будет различным. Таким образом, Java не может сравниться с ними. Одним из решений было бы переопределить метод hashCode в классе KeyCouple.

@Override
public int hashCode() {
    return Objects.hash(......);
}
0 голосов
/ 09 ноября 2018

Ваши пароли разные. Вы создали его с помощью Pwd, и в вашем основном классе вы используете pwd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...