2017-08-03 22 views
-1

1日に複数回WebサイトにログインできるユーザーのArrayListが見つかりました。 最初のarraylistから一意のユーザーのArrayListを作成する方法を教えてください。 つまり、複数のログインを無視する必要があります。 たとえば、Webサイトへのログインが20件あり、すべてのログインが2人のユーザーによって行われた場合、2番目のリストには2つのユーザーオブジェクトのみが含まれている必要があります。 私はJavaプログラミング言語の初心者です。私は助けが必要です。ここで JavaのArrayListにユニークな項目のArrayListを作成する

は、Userクラスです:

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'のためではないのinitデータを持っています。 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

ハッシュコードは文字列ではありません。 –

+0

リスト結果=新しいArrayList (); セット ids = new HashSet (); for(ユーザユーザ:originalList){ if(ids.add(user.getId()){ 結果。ユーザーを追加する); } } –

2

バグis simply not comparing Strings correctlyは、この行うにははるかに良い方法がありますしながら:何LinkedHashSet

  • あなたUserクラス
  • PlaceにhashCodeequalsを追加し、これらの項目は、達成:

    • hashCodeを定義すると、Setのようなハッシュ値を必要とするデータ構造を使用できます。
    • LinkedHashSetは、挿入順序を維持し、余分なメモリを犠牲にして重複を排除します。
+0

hashCodeはintではありません。 hashCodeとは文字列です。 –

+0

@DanielFoo: 'hashCode'は* always *' int'です。あなたは値を計算しています。もしあなたがあまり確かでないなら、 '31 * id.hashCode()+ 31 * date.hashCode()'を使うことができますが、私はこれを頭の上から外して信頼性を保証しませんまったく。 *それは読者のための練習として残しています。 – Makoto

+0

私の場合、ユーザーIDには文字が含まれている可能性があります。文字列IDでユーザーを比較する場合は、どうすればハッシュコードを上書きできますか? –

-1

ストリームAPIを利用することができます。あなたのリストを、一意にIDを比較するカスタムコンパレータを提供するTreeSetに配置します。

次のようなものが必要になります。

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

それは要素が 'Comparable'であることを要求します。 – Makoto

関連する問題