プロが教える店舗&オフィスのセキュリティ対策術

2つのListオブジェクトを比較して、
それぞれの要素に格納されているクラスの属性が
一致しているかどうか、また、格納されている順番が同じかどうかを
調べたいのですが・・。
例えば、以下のようなかんじです↓

1. 比較するListオブジェクト(1):userList
//Userオブジェクト生成
User user1 = new User();
user1.setUserID(2);
User user2 = new User();
user2.setUserID(4);

//UserオブジェクトをListに格納
List userList = new ArrayList();
userList.add(user1);
userList.add(user2);

2. 比較するListオブジェクト(2):specialUserList
※1.と同じ要領で生成されたもの
List specialUserList;

3. 1と2を比較する
比較内容は以下の通りです。
1のListオブジェクト(userList)は、
1番目の要素に、 UserID:2 を持つUserオブジェクト
2番目の要素 に、UserID:4 を持つUserオブジェクト
が格納されていますが、
2のListオブジェクト(specialUserList)も、
これと同じ構成で格納されているかどうか調べたいのです。
例えば、
2のListオブジェクトも、
1番目の要素に、 UserID:2 を持つUserオブジェクト
2番目の要素 に、UserID:4 を持つUserオブジェクト
が格納されていればOKとし、上記以外であれば、NGとします。

例えば、以下のような内容がNGです。
1番目の要素に、 UserID:1(※2以外) を持つUserオブジェクト
2番目の要素 に、UserID:8(※4以外)を持つUserオブジェクト

つまり、List要素に格納されている内容と、その格納されている順番が、
1と2で同じかどうかを調べたいのです。

もし分かる方いましたら、お力をお貸しください・・・

A 回答 (4件)

うーん、、、何か引っかかるような類いの処理では


ないような気がするのですが。

class User{
int userID;
public void setUserID(int i) {
this.userID=i;
}
public int getUserID(){
retrun this.userID;
}
}

上の様に、getUserID() メソッドを作ってしまえば良い
だけなのではないでしょうか?
後は、java.util.List#get() で Object を取得して、
User クラスにキャストして、getUserID() で値を取り、
比較して、、、って事ではないかと。
    • good
    • 0

#2です。



#3の方がおっしゃるとおりですね。
そのほうがかっちょいいプログラムですね。
要件を満たしていますし。

ただUserというクラスの性質上普通にequalsでも大丈夫じゃないのかなぁと思った次第です。
userId:Userクラスのインスタンス=1:1でしょうし。。。
    • good
    • 0

#2>そのまま.equalsできけば???



そりゃー違うでしょ?
と、最初は思ったのですが(笑)「そのまま」というのを省けば素晴らしい回答であるという事に気付きました。
「そのまま」であるのならば、User クラスの equals() メソッドの実装次第ということになります(ArrayList の equals() は内部で要素の equals() を呼び出している)
ですから、もし、Object クラスの equals() の実装を引き継いでいるのならば「参照先」が「等しい」かどうかになりますから、userID の値がどうであれ「等しくない」という結果になってしまいます。
けれど、User クラスの equals() をオーバーライドする事で、ArrayList の equals() を有効活用できるようになります(ArrayList の equals() では、要素格納順に要素の equalse() を呼び出し判定してくれる)

という事で、User クラスの equals() をオーバーライドしてしまいましょう。

class User {
  int userID;
  public void setUserID(int num){
    this.userID=num;
  }
  public int getUserID(){
    return this.userID;
  }
  //ここをオーバーライド
  public boolean equals(Object obj){
    if(obj!=null && obj instanceof User){
      return getUserID()==((User)obj).getUserID();
    }
    return false;
  }
}

以上の記述を加える事で、ArrayList の equals() で希望の比較が出来るようになったと思います。

User user1 = new User();
user1.setUserID(2);
User user2 = new User();
user2.setUserID(4);
List userList=new ArrayList();
userList.add(user1);
userList.add(user2);

User user3 = new User();
user3.setUserID(2);
User user4 = new User();
user4.setUserID(4);
List specialUserList=new ArrayList();
specialUserList.add(user3);
specialUserList.add(user4);

System.out.println("判定:"+userList.equals(specialUserList));

//実行結果
判定:true

以上です。我ながら、これはなかなか「綺麗な実装」だと思います。どうぞご活用を(笑)
    • good
    • 0

そのまま.equalsできけば???

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!