поиск повторяющихся комбинаций в списке - PullRequest
1 голос
/ 17 февраля 2012

Пользователь вводит имя пользователя, пароль и система генерирует уникальное поле. Каждая комбинация пароля и имени пользователя вместе с автоматически сгенерированным уникальным полем сохраняется в Списке как объект. Я хочу выяснить, повторяется ли комбинация имя пользователя-пароль в списке (без учета уникального ключа).

Я хотел бы избежать использования циклов for, чтобы понять это. Использование hashmap, чтобы узнать, есть ли повторяющиеся комбинации-

//hm is the hashmap...
//up is the list....
for(int i=0; i<up.length(); i++){
  if(hm.contains(up[i])){
    System.out.println("Repeated combination");
    break;
    }
   else{
       hm.put(up[i],i);
    }
 }

Однако объект имеет уникальное автоматически сгенерированное поле, и приведенная выше логика не будет работать. Любые предложения для достижения этого в кратчайшие сроки.

1 Ответ

1 голос
/ 17 февраля 2012

Я предполагаю, что up [i] - это некоторый класс (User), который имеет имя пользователя, пароль и unique_id в виде трех полей.

Если это так, вы можете создать обертку вокруг этого класса (UserWrapper) и переопределить, равный /Методы hashCode полагаться только на атрибуты имени пользователя / пароля класса User.

Это должно быть очень быстро для кодирования / тестирования

РЕДАКТИРОВАТЬ: Примеры классов приведены ниже.Вы могли бы вы LinkedHashMap (так что вы будете иметь функциональность карты и при этом пользователи будут заказывать так же, как вы их положили в)

class User {
    private final String id = UUID.randomUUID().toString();
    private final String username;
    private final String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof User) {
            User user = (User) obj;
            return id.equals(user.getId()) &&
                    username.equals(user.getUsername()) &&
                    password.equals(user.getPassword());
        }
        return false;
    }

    public int hashCode() {
        return id.hashCode() + username.hashCode() * 31 + password.hashCode() * 31 * 31;
    }

    public String getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

Оболочка:

class UserWrapper {
    private final User user;

    public UserWrapper(User user) {
        this.user = user;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof UserWrapper) {
            UserWrapper userWrapper = (UserWrapper) obj;
            return user.getUsername().equals(userWrapper.getUser().getUsername()) &&
                    user.getPassword().equals(userWrapper.getUser().getPassword());
        }
        return false;
    }

    public int hashCode() {
        return user.getUsername().hashCode() + user.getPassword().hashCode() * 31;
    }

    public User getUser() {
        return user;
    }
}

Искатель:

class DuplicateUserFinder {

    public List<UserWrapper> findDuplicates(List<UserWrapper> allUsers) {
        final List<UserWrapper> duplicateList = new ArrayList<UserWrapper>();
        final Set<UserWrapper> duplicateSet = new HashSet<UserWrapper>();

        for (UserWrapper wrapper : allUsers) {
            if (duplicateSet.contains(wrapper)) {
                duplicateList.add(wrapper);
            } else {
                duplicateSet.add(wrapper);
            }
        }

        return duplicateList;
    }

}

Модульный тест:

public class DuplicateUserFinderTest {

    private final DuplicateUserFinder finder = new DuplicateUserFinder();

    @Test
    public void shouldReturnEmptyIfNoDuplicates() {
        User user1 = new User("user1", "pass1");
        User user2 = new User("user2", "pass2");
        UserWrapper userWrapper1 = new UserWrapper(user1);
        UserWrapper userWrapper2 = new UserWrapper(user2);

        Assert.assertTrue(finder.findDuplicates(Arrays.asList(userWrapper1, userWrapper2)).isEmpty());
    }

    @Test
    public void shouldReturnDuplicates() {
        User user1 = new User("user", "pass");
        User user2 = new User("user", "pass");
        UserWrapper userWrapper1 = new UserWrapper(user1);
        UserWrapper userWrapper2 = new UserWrapper(user2);

        Assert.assertTrue(finder.findDuplicates(Arrays.asList(userWrapper1, userWrapper2)).contains(userWrapper2));
        Assert.assertThat(finder.findDuplicates(Arrays.asList(userWrapper1, userWrapper2)).size(), CoreMatchers.equalTo(1));
    }

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