2017-02-22 3 views
0

私はこれをたくさん検索し、可能な回答として提供されている投稿をチェックしましたが、誰も私に答えを与えてくれないようです。アレイリスト内のオブジェクトを削除する方法

私はオンラインユーザーを保管するこのarraylistを持っています。 ユーザーリストから読み込んで追加することができます。 問題は、私はそれを削除する方法を見つけることができないようです。

私は

online.remove("MyUsername"); 

を試してみました私のクラスおよび初期化子は、このようなものです:

ArrayList<userOnline> online = new ArrayList<userOnline>(); 

    class userOnline { 
     String userName; 
     String data1; 
     String data2; 
     String data3; 
    } 

私はそれがユーザ名とオブジェクトの行を見つけ、行を削除するだろうと思った、あるいは少なくとも、ユーザ名、それは何も削除して、私に何かエラーを与えていません。

私はそれを動作させるために何ができますか?これが不可能な場合、代替手段として何が使えますか?説明している文書へのポインタが十分な助けになるでしょう!

ありがとうございます!

溶液はこのだったように思えたが、これは議論の後

for (int i=0; i <online.size(); i++) { 
    if(online.get(i).userName.equals("username")) { 
     online.remove(i); 
    } 
} 

良い習慣と見なされ、この検索を処理し、削除するには、Javaのための唯一の正しい方法は、

あるように多くのフィードバックが思われていません
Iterator<userOnline> it = online.iterator(); 
     while (it.hasNext()) { 
      userOnline user = it.next(); 
      if (currentLogin.equals(user.userName)) { 
       it.remove(); 
      } 
    } 
+1

あなたがする必要がある);

また、あなたは

ArrayList<userOnline> online = new ArrayList<>(); userOnline newUser = new userOnline(); newUser.userName = "MyUsername"; online.add(newUser); System.out.println(online.size()); Iterator<userOnline> it = online.iterator(); while (it.hasNext()) { userOnline user = it.next(); if ("MyUsername".equals(user.userName)) { it.remove(); } } System.out.println(online.size()); 

もおそらく本当にクールな「ストリーム」ベースのソリューションが、小さなステップをあります... Iteratorを使用し、検索としてそれを削除することもできますuserOnlineクラスのequals()を定義して、オブジェクトの検索と削除ができるようにします。 –

+0

要素のインデックスを使用して削除するか、要素のオブジェクト –

+0

を使用して削除することができますが、 'equals()'が文字列の場合はtrueを返さないようにすることができます。 – Bohemian

答えて

2

基本的に、あなたが直接、リンゴと梨(StringuserOnline)を比較することはできません。次のように

検索ができます。はい、equalsを上書きできますが、実際には1つではなく、すべてのプロパティと一致するはずです。

簡単な解決策は、各オブジェクトにあなたがどちらかあなたがそれを削除するために使用することができindexやオブジェクトの参照を返したい値を持つuserNameプロパティを比較し、Listを検索することです。

0

コードでは、UserOnlinesのリストから文字列を削除するよう求めています。remove(Object o)メソッドのオブジェクト参照を使用する必要があります。または、目的のオブジェクトのインデックスを見つける必要があります。 remove(int index)メソッドを削除して使用します。どのようにあなたのオブジェクトをリストに追加していますか?リスト自体を参照として使用している場合は、自分のメソッドを作成して、 "MyUserName"というオブジェクトを定義する必要があります。

+0

私は新しいuserOnline()を作成しています。新しいユーザに変数を入れ、新しいユーザをarraylistに追加します。 –

+0

次のようなことをしている場合:UserOnline myUser = new UserOnline()次にlist.remove(myUser)を実行します。しかし、あなたがlist.add(新しいUserOnline())をしている場合は、他の人があなたが望むオブジェクトを見つけ出す方法を定義する必要があると言及しています。それがあなたが使いたいものなら、あなたの名前フィールドを見るためのいくつかの提案があります。 –

2

それはあなたも作ることができるので、

public Array<userOnline> removeUserByName(Array<userOnline> users, String nameToFind) 
{ 
    for(int i = 0; i < users.size(); i++) 
    { 
     if(users.get(i).userName.equals(nameToFind)) 
     { 
      users.remove(i); 
      return users; 
     } 
    } 
    return users; 
} 

のように指定された名前を持つユーザーを見つけたときには、ユーザーのリストを取り込み、与えられた名前の最初の発生を発見し、それを削除する機能を作成することができますuserOnlineオブジェクトのリストを格納しているクラスのこの関数部分では、配列を関数に渡す必要はありません。

5

私はここにある、だまされやすい人や、適切なドキュメントを見つけることができませんでした:

Iteratorを使用してください:あなたが興味を持っている要素のインデックスを見つけるために、リストの上に

for (Iterator<userOnline> iterator = online.iterator(); iterator.hasNext();) { 
    if (iterator.next().getName().equals("MyUsername")) { 
     iterator.remove(); 
    } 
} 
+0

これは、各オンライン配列の "MyUsername"を持つすべてのオブジェクトを削除/検索するでしょうか?だからそれは検索などを行うのに良いですか? –

2

反復中:

int idx = -1; 
    for (int i = 0; i < online.size(); i++) { 
     if(online.get(i).userName.equals("MyUsername")) 
     { 
      idx = i; 
     } 
    } 

関連する要素を削除するには、このインデックスを使用します。

if(idx != -1) { 
    online.remove(online[idx]); 
} 

これにより、最初のオカレンスのみが削除されます。このコードを関数に入れて繰り返し呼び出すと、すべての出現箇所を見つけることができます。

+0

@MadProgrammerありがとう。いくつかの異なるプログラミング言語が今日使用されています。 – sgrg

+0

うわー、それについて教えてください:P – MadProgrammer

+0

@sgrg、あなたは私の記事とこれに追加した答えの違いを説明できますか? –

2

ArrayListに含まれるuserOnlineオブジェクトを検索し、一致のインデックスまたは一致の参照を見つける必要があります。これらのいずれかを取得したら、オーバーロードされたremove()メソッドのいずれかを使用して、リストからオブジェクトを削除できます。デフォルトでは、equalsメソッドは参照を比較します。

private userOnline findUserOnlineWithUsername(String username) { 
    Iterator<userOnline> it = online.iterator(); 
    onlineUser olu = null; 

    while(it.hasNext()) { 
     olu = it.next(); 
     if (olu.userName.equals(username)) { return olu;} 
    } 

    return null; 
} 
関連する問題