特定の値を持つ要素を削除したいArrayListがあります...
たとえば。
ArrayList<String> a=new ArrayList<String>();
a.add("abcd");
a.add("acbd");
a.add("dbca");
arraylist と .remove() メソッドを反復して要素を削除できることはわかっていますが、反復中にそれを行う方法がわかりません。2番目の要素である値「acbd」を持つ要素を削除するにはどうすればよいですか?
特定の値を持つ要素を削除したいArrayListがあります...
たとえば。
ArrayList<String> a=new ArrayList<String>();
a.add("abcd");
a.add("acbd");
a.add("dbca");
arraylist と .remove() メソッドを反復して要素を削除できることはわかっていますが、反復中にそれを行う方法がわかりません。2番目の要素である値「acbd」を持つ要素を削除するにはどうすればよいですか?
あなたの場合、削除するオブジェクトがわかっているため、リストを反復処理する必要はありません。いくつかのオプションがあります。最初に、インデックスでオブジェクトを削除できます (したがって、オブジェクトが 2 番目のリスト要素であることがわかっている場合)。
a.remove(1); // indexes are zero-based
または、文字列の最初の出現を削除できます。
a.remove("acbd"); // removes the first String object that is equal to the
// String represented by this literal
または、特定の値を持つすべての文字列を削除します。
while(a.remove("acbd")) {}
コレクションにもっと複雑なオブジェクトがあり、特定のプロパティを持つインスタンスを削除したい場合は、もう少し複雑です。remove
そのため、削除したいオブジェクトと同じオブジェクトを使用してそれらを削除することはできません。
そのような場合、私は通常、2 番目のリストを使用して、削除するすべてのインスタンスを収集し、2 番目のパスでそれらを削除します。
List<MyBean> deleteCandidates = new ArrayList<>();
List<MyBean> myBeans = getThemFromSomewhere();
// Pass 1 - collect delete candidates
for (MyBean myBean : myBeans) {
if (shallBeDeleted(myBean)) {
deleteCandidates.add(myBean);
}
}
// Pass 2 - delete
for (MyBean deleteCandidate : deleteCandidates) {
myBeans.remove(deleteCandidate);
}
次のようにIteratorを使用する必要があります。
Iterator<String> iterator = a.iterator();
while(iterator.hasNext())
{
String value = iterator.next();
if ("abcd".equals(value))
{
iterator.remove();
break;
}
}
そうは言っても、 ArrayListクラスによって提供されるremove(int index)またはremove(Object obj)を使用できます。ただし、ループの反復中にこれらのメソッドを呼び出すと、ConcurrentModificationExceptionが発生するため、これは機能しないことに注意してください。
for(String str : a)
{
if (str.equals("acbd")
{
a.remove("abcd");
break;
}
}
しかし、これは(ループの内容を反復していないため):
a.remove("acbd");
より複雑なオブジェクトがある場合は、 equalsメソッドをオーバーライドする必要があります。
を使用するだけmyList.remove(myObject)
です。
クラスの equals メソッドを使用します。http://docs.oracle.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object )を参照してください。
ところで、もっと複雑なことをする必要がある場合は、述語などでそれを行うための多数のユーティリティを備えた guava ライブラリをチェックしてください。
イテレータを使用してリストをループし、必要なオブジェクトを削除します。
Iterator itr = a.iterator();
while(itr.hasNext()){
if(itr.next().equals("acbd"))
itr.remove();
}
リストインターフェースで利用可能なcontains()メソッドを使用して、値がリストに存在するかどうかを確認します。その要素が含まれている場合は、そのインデックスを取得して削除します
一致条件に基づいて配列リストから要素を削除するスニペットは次のとおりです。
List<String> nameList = new ArrayList<>();
nameList.add("Arafath");
nameList.add("Anjani");
nameList.add("Rakesh");
Iterator<String> myItr = nameList.iterator();
while (myItr.hasNext()) {
String name = myItr.next();
System.out.println("Next name is: " + name);
if (name.equalsIgnoreCase("rakesh")) {
myItr.remove();
}
}
以下のコードを試してください:
public static void main(String[] args) throws Exception{
List<String> l = new ArrayList<String>();
l.add("abc");
l.add("xyz");
l.add("test");
l.add("test123");
System.out.println(l);
List<String> dl = new ArrayList<String>();
for (int i = 0; i < l.size(); i++) {
String a = l.get(i);
System.out.println(a);
if(a.equals("test")){
dl.add(a);
}
}
l.removeAll(dl);
System.out.println(l);
}
あなたの出力:
[abc, xyz, test, test123]
abc
xyz
test
test123
[abc, xyz, test123]