2017-08-03 48 views
-1

我得到了一個ArrayList的用戶,他們每天可以多次登錄到Web站點。 如何從第一個數組列表中創建唯一用戶的ArrayList。 換句話說,我需要忽略多個登錄。 例如,如果有20個登錄到網站,並且所有這些登錄都由兩個用戶完成,那麼第二個列表應該只包含兩個用戶對象。 我是Java編程語言的新手,我需要幫助。在Java中的ArrayList中創建唯一項目的ArrayList

下面是用戶等級:

public class User { 

    private String id 
    private String date; 

    public String getId() { 
     return id 
    } 

    public void setId(String id) { 
     this.id = id 
    } 

    public String getDate() { 
     return date; 
    } 

    public void setDate(String date) { 
     this.date = date; 
    } 
} 

這裏是我是如何去解決這個問題,但由於某種原因,這是行不通的。

ArrayList<User> userList = new ArrayList<>(); 
ArrayList<User> uniqueUserlist = new ArrayList<>(); 

    String id = null; 

    for(User user : userList) { 

     if (user.getId() != id) { 
      uniqueUserlist.add(user); 
     } 

     id = user.getId(); 
    } 

謝謝。

+0

您使用循環 –

+2

'=='和'!='在Java中比較基準的平等,而不是數據面前人人平等有你'userList'未初始化的數據。如果你想檢查id是否相等,使用'user.getId()。equals(id)'。 – azurefrog

+0

如果你修改你的'User'類來給它明智的['equals'](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang .Object)和['hashCode'](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--)方法(爲了完整性而使用'toString') ,那麼你可以使用「[從java中的arraylist獲取唯一值](https://stackoverflow.com/questions/13429119)」中的解決方案。 –

回答

1

如果你不想重複但想要使用ArrayList,可以快速修復所有項目到HashSet(不允許重複項目),清除ArrayList,然後將項目從HashSet返回到ArrayList中。

+0

哈希碼是不是int它是一個字符串? –

+0

List result = new ArrayList (); 設置 ids = new HashSet (); (用戶用戶:originalList){ (if)(ids.add(user.getId()){result)。添加用戶); } } –

2

當你的錯誤is simply not comparing Strings correctly,有一個更好的方式來做到這一點:

  • 添加hashCodeequalsUser
  • 將這些物品放入一個LinkedHashSet

什麼你完成:

  • 定義hashCode允許您使用需要散列值的數據結構,如Set
  • LinkedHashSet保留了插入順序並消除了一些額外內存的副本。
+0

什麼是hashCode不是int?什麼是hashCode是字符串? –

+0

@DanielFoo:'hashCode' *總是*'int'。你正在計算一個值。如果你不太確定,那麼你可以使用'31 * id.hashCode()+ 31 * date.hashCode()',但請注意,我是這麼做的,並且不會保證它的可靠性任何。 *我*作爲練習給讀者。 – Makoto

+0

在我的情況下,用戶標識可能有字母。如何重寫散列碼,如果我要按字符串ID比較用戶,則該值等於。 –

-1

您可以使用Stream API ....將您的列表放在您提供自定義比較器的TreeSet中,該比較器可以唯一地比較id。

下面的東西可以滿足您的需求。

ArrayList<User> uniqueUserlist = userList.stream() 
          .collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingInt(User::getId))), ArrayList::new)); 
+0

這就要求元素是「可比較的」。 – Makoto

相關問題