2012-02-17 2 views
1

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

Я хотел избегать использования для циклов, чтобы понять это. Использование HashMap, чтобы выяснить, есть ли повторены combinations-

//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

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

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

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

EDIT: Примеры классов ниже. Вы не могли бы вы 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; 
    } 
} 

Wrapper:

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; 
    } 
} 

Finder:

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)); 
    } 

} 
+0

Да, как вы сказали он имеет 3 поля. Не могли бы вы объяснить, как именно я могу это достичь. Итак, вы хотите сказать, что я все равно использую hashmap или напрямую использую List? – srock

+0

Вы имеете в виду нечто вроде public boolean equals (Object obj) { if (this.username == obj.username && this.pwd == obj.pwd) return true; else return false; } – srock

+0

Я привел примеры для классов (игнорируя возможные нулевые значения). –

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