• ベストアンサー

Listに格納されているオブジェクトの照合(パターンマッチング?)

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で同じかどうかを調べたいのです。 もし分かる方いましたら、お力をお貸しください・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.1

うーん、、、何か引っかかるような類いの処理では ないような気がするのですが。 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() で値を取り、 比較して、、、って事ではないかと。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.4

#2です。 #3の方がおっしゃるとおりですね。 そのほうがかっちょいいプログラムですね。 要件を満たしていますし。 ただUserというクラスの性質上普通にequalsでも大丈夫じゃないのかなぁと思った次第です。 userId:Userクラスのインスタンス=1:1でしょうし。。。

全文を見る
すると、全ての回答が全文表示されます。
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.3

#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 以上です。我ながら、これはなかなか「綺麗な実装」だと思います。どうぞご活用を(笑)

全文を見る
すると、全ての回答が全文表示されます。
  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.2

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Listに格納されたオブジェクトの属性毎に集計

    【1】 生徒(Student)クラスを生成し、住所(address)などを設定 【2】 1を、List型オブジェクトに格納。 【3】 2のListの中の生徒(Student)オブジェクトから、住所毎に集計する 3のやり方を教えて下さい。 例えば、以下のような感じです。 --------------------------------------------------- //【1】 Studentオブジェクトを大量に生成し、それぞれに住所などを設定 Student smith = new Student(); smith.setAddress("hongkong"); Student ken = new Student(); ken.setAddress("tokyo"); Student scott = new Student(); scott.setAddress("scottland"); (以下、同様)  ・  ・  ・ //【2】 生成した全てのStudentオブジェクトをListに格納していく。 List studentList = new ArrayList(); studentList.add(smith); studentList.add(ken); studentList.add(scott); (以下、同様)  ・  ・  ・ //【3】 ListオブジェクトからStudentオブジェクトを取得し、 //同じ住所毎に、集計する //<例> //hongkong--- 4900人 //tokyo--- 3800人 //scottland--- 4600人 --------------------------------------------------- 1や2は、すでに出来上がっていて、変更できない為、 3のやり方のみ教えて下さい。 (Studentオブジェクトが格納されたListオブジェクトが、既に存在することが前提) また、Studentオブジェクトが大量にある為、 処理が重くなる実装の仕方は避けたいです・・。 もし分かる方いましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • javaでリストにオブジェクトを入れたい

    ユーザー情報を配列にしたものをセッターを使い、オブジェクトをリストに入れる処理をしたいです。 例(yamada,pas1,山田) リストを使用しているのは後々他のユーザーを追加する予定の為です。 例(yamada,pas1,山田) (suzuki,pas2,鈴木) リストにlist.add("yamada")などと入力すれば表示させることが出来るのですが、 オブジェクトを入れるとうまくいきません。list.add(オブジェクト名); 実行するとコンソールに「GetUser@19e0bfd」のようなものが出てきます。どうすればよろしいでしょうか? ここから上は省略。カプセル化したゲッターセッターの処理をしています。 public static void main(String[] args){   GetUser gu = new GetUser();//ユーザー情報をnew      String name[]=new String[3];   name[0]="yamada";   name[1]="pas1";   name[2]="山田";   gu.setId(name[0]);   gu.setPass(name[1]);   gu.setName(name[2]);   List list = new ArrayList();   list.add(gu); }

    • ベストアンサー
    • Java
  • Listデータを重復せずにSetに格納したい

    お世話になっています。 以下のクラスがあるとき public class UserFormBean_2 { private int userNum; private String userId; private String password; public void setUserNum(int userNum) { this.userNum = userNum; } public int getUserNum() { return this.userNum; } public void setUserId(String userId) { this.userId = userId; } public String getUserId() { return this.userId; } public void setPassowd(String password) { this.password = password; } public String getPassword() { return this.password; } public String toString() { return this.userId; } } Listにこのクラスが格納されている場合、 userIdをキーに、userIdを重複せずに格納することは可能なのでしょうか? 実行ソースは以下です。 public class Run{ public static void main(String[] args){ Set ss = new HashSet(); List array2 = new ArrayList(); (データ1) UserFormBean_2 userFr = new UserFormBean_2(); userFr.setUserId("maki"); userFr.setPassowd("なつのおとしご"); array2.add(userFr); //仮に、先にSetに値を格納する ss.add(userFr); (データ2) userFr = new UserFormBean_2(); userFr.setUserId("sayaka"); userFr.setPassowd("motomiti"); array2.add(userFr); (データ3) userFr = new UserFormBean_2(); userFr.setUserId("neneko"); userFr.setPassowd("ゆずは!"); array2.add(userFr); (データ4) userFr = new UserFormBean_2(); userFr.setUserId("森の山手"); userFr.setPassowd("なつのおとしご"); array2.add(userFr); //仮にSetに値を格納する ss.add(userFr); (データ5) userFr = new UserFormBean_2(); userFr.setUserId("maki"); userFr.setPassowd("なつのおとしご"); array2.add(userFr); System.out.println("size:"+array2.size()); System.out.println("set_size:"+ss.size()); UserFormBean_2 uB = new UserFormBean_2(); UserFormBean_2 uf = new UserFormBean_2(); System.out.println(" -- set -- "); } } よろしくお願いします。 for( Iterator u=array2.iterator();u.hasNext(); ) { uB = (UserFormBean_2)u.next(); System.out.println(uB.getUserId()); for(Iterator s=ss.iterator();s.hasNext(); ) { uf = (UserFormBean_2)s.next(); System.out.println(uf.getUserId()); ss.add(uB); }

    • ベストアンサー
    • Java
  • PHPで、オブジェクトが格納された配列を使う方法を教えて下さい。

    PHPで、オブジェクトが格納された配列を使う方法を教えて下さい。 PHP初学者です。 以下のようなプログラムを作成したいのです。 1.XML文書の内容を取得 2.XMLの要素<data>をTestDataオブジェクトに格納 3.TestDataオブジェクトの集合を持つTestDataListオブジェクトに、2で作成したTestDataオブジェクトを格納 4.XML文書に存在する<data>要素がなくなるまで2~3を繰り返す 5.全ての<data>要素を格納したら、今度はTestDataListオブジェクトから全てのTestDataオブジェクトを取得して、その中身を画面に表示 ※<data>要素は子要素<name>を持つ 作ってみたのですが、TestDataオブジェクトの格納に失敗しているのか、TestDataListからのTestData取得に失敗しているのか、画面に何も表示されません。 プログラムは以下の通りです。 ・<data>要素の中身を格納するためのクラス <?php class TestData { private $_name; public function setName($name) { $this -> _name = $name; } public function getName() { return $this -> _name; } } ・TestDataオブジェクトの集合を持つクラス <?php class TestDataList { private $_list; private $_size; public function __construct() { $_size = 0; } public function addData($data) { if(isset($_list)) { $_list[$_size++] = $data; return; } $_list = array($data); $_size++; } public function getData($index) { return $_list[$index]; } public function size() { return count($_list); } } ・画面に表示するPHPプログラム <?php require_once "TestData.php"; require_once "TestDataList.php"; $_xml = simplexml_load_file("guest.xml"); $_list = new TestDataList(); $_cnt = 0; foreach($_xml -> data as $data) { $tmpdata = new TestData(); $tmpdata -> setName($data -> name); $_list -> addData($tmpdata); $_cnt++; } ?> <html> <body> <?php print("Count:".$_cnt."<br/>"); print("Size :".$_list -> size()); for($j = 0 ; $j < $_list -> size() ; $j++) { $outdata = $_list -> getData($j); print($outdata -> getName()."<br/>"); } ?> </body> </html> ・実行結果 Count:3 Size :0 PHPに詳しい方、上記プログラムの不備を教えて下さい。宜しくお願いします。

    • ベストアンサー
    • PHP
  • サイズのわからない配列

    お世話になっております。 最初からサイズの不明な配列を扱いたいときに、いろいろ調べたら 配列が1次元の場合、次のような方法で扱えることがわかりました。 dim userlist as new list(of string) 'List dim user as string() '配列 userlist.add("taro") userlist.add("hanako") user = userlist.toarray 'Listを配列に変換 debug.print(user.length) '配列のサイズを求める ところが、配列が2次元の場合、Listは使えないようなのです。 UserID password ------+--------- taro abc hanako xyz こんな感じの2次元データを最初から配列の大きさを定義すること なく利用したいのですが、何か良い方法がございましたら、ご教授 のほどお願いいたします。

  • Listインターフェースの使用法

    Listインターフェースの使い方ですが、 List list; String a = new String("AAA"); String b = new String("BBB"); list.add(a); list.add(b); というふうにするとlistは初期化されていませんとエラーになります。 また、Listに格納したオブジェクトの取り出し方も教えてください。

  • オブジェクトを配列として扱いたい

    Java(オブジェクト指向)を始めて数日の者です。 LinkedListを利用し、インスタンス化したオブジェクトをListに入れて 扱えるようにしたいと考えています。 具体的には LinkedList<クラス名> array = new LinkedList<クラス名>(); クラス名 object1 = new クラス名(); -object1の処理- array.add(object1); -object1の処理- array.add(object1); -object1の処理- array.add(object1); このようにして、object1を配列で管理するイメージです。 object1の処理結果は、毎度変わっています。 しかしこれですと、最後のobject1の処理の内容がすべてのarray(i)に入ってしまいます。 要は、array(i)は全て、同じobject1を参照しているだけ。 object1の変更結果がarray(i)に入っていくというイメージでは無い、ということでしょうか? また、この他でインスタンス化したものを配列で管理できるような方法がございましたら、ご教授いただけると幸いです。m(_ _)m 動的に配列の要素数を変更(要素が追加)ができるようにしたいのです。

    • ベストアンサー
    • Java
  • ArrayListはオブジェクトのポインタを渡している?

    ArrayListはオブジェクトのポインタを渡している? 例えば、一つのメソッド内に以下のように書くと、出力は最下部のようになります。 listに入れたモデルを取り出さずにModelを変更しても、listに入れたモデルを変更したのと同じことが出来ています。 C言語で言うところの(Cはあまり覚えていませんが…)、ポインタを渡しているようなイメージになるのでしょうか? --コード-- Model model1 = new Model("model1"); Model model2 = new Model("model2"); ArrayList list = new ArrayList<Model>(); list.add(model1); list.add(model2); showList(list); model1.setName("model1_"); showList(list); --出力-- model1 model2 model1_ model2

    • ベストアンサー
    • Java
  • VC++でオブジェクトのコレクション格納

    すみません。 教えてください。 VC++言語を勉強しているのですが、不明点があるため教えていただきたいのです。 <VBサンプル> Set Col = new Collection For i = 1 To nMaxCount Set objIF = New iniFile 'iniファイル設定クラス With objIF .iniDirPath = mstriniDirPath .iniFileName = mstriniFileName nResult = .iniStart 'クラスの実行関数 If nResult < 0 Then iniReadRecStack = nResult Exit For End If ' コレクションにiniファイルクラスオブジェクトを格納する。 col.Add objIF, CStr(Count) Next 上記のようなことをVC++でやりたいのですが、可能でしょうか。 もしよければ、コレクションに格納する方法を教えてください。 よろしくお願いします。

  • listの格納されている値をGridViewに追加

    下記のようなロジックを動かそうとしていますが、うまくいきません。 「データベースからinteger型の値を取得して、それをreadメソッドでlistに一旦格納し、For Eachで1つずつGridviewに追加していく。」 エラー内容でググっても良くわからなかったので、解決策がわかる方がいましたらご助言お願い致します。。 *DBから値を取得し、listに格納するところは問題なく動いていますが、Gridviewに追加するところでこけます。 エラー箇所:GridView1.Columns.Add(item) エラー内容:「型 'Integer' の値をを 'System.Web.UI.WebControls.DataControlField' に変換できません。」 Dim list As List(Of Integer) = New List(Of Integer) Dim result As Integer = Byte.MinValue Do While testReader.Read() result = Convert.ToInt32(testReader("price")) list.Add(result) Loop For Each item In list GridView1.Columns.Add(item) Next