Java Listなどの集合系のremoveAllの使い方
4381 ワード
転載:http://blog.csdn.net/will_awoke/articale/detail/6528872
このタイトルを見て、集合的なレモベオールの方法さえうまく使えないのに、プログラマになるのかと首をかしげる人が多いと思います.
はい、私は私が確かにこの方法を使っていないことを認めて、私を蔑視しましょう.O(∩∩)Oは
まず問題を貼る-->
エンティティクラス(User):
[java] view plin copy
public クラス User { prvate String name prvate 要点 age; //setter and getter public String get Name() { return name } public void set Name(String) name { this.name = name } public 要点 getAge() { return age; } public void setAge(int メッセージ { this.age = age; } )
テストセット類(UserList):
[java] view plin copy
import java.util.ArayList; import java.util.List; public クラス UserList { prvate List<User> subList; prvate List<User> all List; public UserList(){ subList=new ArayList<User>() allList=new ArayList<User>() for(int i=0;i<3;i+){ User user=new User(); user.setAge(i) user.setName(「lyh」+i); subList.add(user) } for(int i=0;i<10;i+){ User user=new User(); user.setAge(i) user.setName(「lyh」+i); allList.add(user) } } public static void main(String[] アークス UserList userList=new UserList() userList.allList.removeAll(userList.subList)//RemoveAllメソッドを呼び出す System.out.println(userList.allList.size(); } )
皆さんは最後のプリントの結果はいくらですか? 7?That's wrong 結果は10です
どうしてですか?removeAll方法に問題がありますか?
これは最近removeAllを使っていた時に出会った疑問です.(もちろん、実際の問題を簡単に抽象化しました.)当時はそれが理解できなくて、甚だしきに至っては幼稚にJavaのBUGだと思っていました.自分の頭がBUGです.
原因解析:
まずAPIを見ます
[x] view plin copy
bollan removeAll(Collection)<?> c) 指定をリストから削除 コレクション に含まれるすべての要素(オプション操作). そうです.つまり、サブセットに含まれている要素を取り除くということです.なぜ7ではなく、10ですか?
APIの説明を見て、含まれるすべての要素を削除します.この単語に注意してください.
removeAll方法を実行する時に、まず集合元素を比較しますので、もし元素が等しいなら除去操作を行います.これについて言えば、多くの人はもう分かりました.同じではないので、除去を実行しませんでした.
ソースを確認して、上記の推測をさらに確認し、removeとremoveAllの方法で実現しました.
[java] view plin copy
public bollan removeAll(Collection)<?> c) { bollan modified = false; Iterator it = iterator(); while (it.has Next() { if (c.co ntains(it.next()))) { it.remove() modified = true; } } return modified } [java] view plin copy
public bollan remove(Object) o) { Iterator it = iterator(); if (o==null) { while (it.has Next() { if (t.next()==null) { it.remove() return true; } } } else { while (it.has Next() { if (o.equals(it.next()) { it.remove() return true; } } } return false; } removeAllメソッドを呼び出した時に、実際には、remove方法を循環的に呼び出していますが、remove方法には重要なコードがあります.
if(o.equals(it.next)!
Soは、上述の例においてエンティティ類にOverride hashCodeとequals方法がないため、removeAll方法を実行する時はequals方法により、集合要素が等しいかどうかを判断します.Override equals方法がないと、デフォルトはまだ比較対象ですので、上記の問題が発生します.
結局、やはり基礎がしっかりしていないので、同時に自分にも目を覚まして、実体の種類を書く時にはできるだけOverride hashCodeとequalsの方法を書くと、いつか問題が起こるかもしれません.
問題の概要は終わりました.もちろん、この問題は本質的に簡単です.同じ疑問を持っている友達に会ったら少しだけ助けてほしいです.
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
プロジェクトをしています.二つのLiSTランキングを並べ替える時、レモヴェルが現れます. falseに戻ります.削除に失敗したのは、オブジェクトを書き換えるためのhascodeとequalメソッドがないからです.
このタイトルを見て、集合的なレモベオールの方法さえうまく使えないのに、プログラマになるのかと首をかしげる人が多いと思います.
はい、私は私が確かにこの方法を使っていないことを認めて、私を蔑視しましょう.O(∩∩)Oは
まず問題を貼る-->
エンティティクラス(User):
[java] view plin copy
public クラス User { prvate String name prvate 要点 age; //setter and getter public String get Name() { return name } public void set Name(String) name { this.name = name } public 要点 getAge() { return age; } public void setAge(int メッセージ { this.age = age; } )
テストセット類(UserList):
[java] view plin copy
import java.util.ArayList; import java.util.List; public クラス UserList { prvate List<User> subList; prvate List<User> all List; public UserList(){ subList=new ArayList<User>() allList=new ArayList<User>() for(int i=0;i<3;i+){ User user=new User(); user.setAge(i) user.setName(「lyh」+i); subList.add(user) } for(int i=0;i<10;i+){ User user=new User(); user.setAge(i) user.setName(「lyh」+i); allList.add(user) } } public static void main(String[] アークス UserList userList=new UserList() userList.allList.removeAll(userList.subList)//RemoveAllメソッドを呼び出す System.out.println(userList.allList.size(); } )
皆さんは最後のプリントの結果はいくらですか? 7?That's wrong 結果は10です
どうしてですか?removeAll方法に問題がありますか?
これは最近removeAllを使っていた時に出会った疑問です.(もちろん、実際の問題を簡単に抽象化しました.)当時はそれが理解できなくて、甚だしきに至っては幼稚にJavaのBUGだと思っていました.自分の頭がBUGです.
原因解析:
まずAPIを見ます
[x] view plin copy
bollan removeAll(Collection)<?> c) 指定をリストから削除 コレクション に含まれるすべての要素(オプション操作). そうです.つまり、サブセットに含まれている要素を取り除くということです.なぜ7ではなく、10ですか?
APIの説明を見て、含まれるすべての要素を削除します.この単語に注意してください.
removeAll方法を実行する時に、まず集合元素を比較しますので、もし元素が等しいなら除去操作を行います.これについて言えば、多くの人はもう分かりました.同じではないので、除去を実行しませんでした.
ソースを確認して、上記の推測をさらに確認し、removeとremoveAllの方法で実現しました.
java.util.AbstractCollection<E>
具体的なコードは:[java] view plin copy
public bollan removeAll(Collection)<?> c) { bollan modified = false; Iterator it = iterator(); while (it.has Next() { if (c.co ntains(it.next()))) { it.remove() modified = true; } } return modified } [java] view plin copy
public bollan remove(Object) o) { Iterator
if(o.equals(it.next)!
Soは、上述の例においてエンティティ類にOverride hashCodeとequals方法がないため、removeAll方法を実行する時はequals方法により、集合要素が等しいかどうかを判断します.Override equals方法がないと、デフォルトはまだ比較対象ですので、上記の問題が発生します.
結局、やはり基礎がしっかりしていないので、同時に自分にも目を覚まして、実体の種類を書く時にはできるだけOverride hashCodeとequalsの方法を書くと、いつか問題が起こるかもしれません.
問題の概要は終わりました.もちろん、この問題は本質的に簡単です.同じ疑問を持っている友達に会ったら少しだけ助けてほしいです.
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
プロジェクトをしています.二つのLiSTランキングを並べ替える時、レモヴェルが現れます. falseに戻ります.削除に失敗したのは、オブジェクトを書き換えるためのhascodeとequalメソッドがないからです.
@Override
public int hashCode() {
// TODO Auto-generated method stub
//return super.hashCode();
return id;
}
@Override
public boolean equals(Object o) {
// TODO Auto-generated method stub
//return super.equals(o);
ChannelItem item = (ChannelItem) o;
if(this.id.equals(item.id)){
return true;
}else{
return false;
}
}