- ベストアンサー
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オブジェクトが大量にある為、 処理が重くなる実装の仕方は避けたいです・・。 もし分かる方いましたら、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
もう遅いかもしれませんが、一応回答を。 (もちろん私も、その(1)と(2)設計には眉をひそめます) // 集計 HashMap counts = new HashMap (); for (Iterator i = studentList.iterator (); i.hasNext (); ) { final Student student = (Student) i.next (); final String address = student.getAddress (); if (counts.containsKey (address)) { ((int[]) counts.get (address))[0]++; } else { counts.put (address, new int[] {1}); } } // 集計結果を取り出す例 for (Iterator i = counts.keySet ().iterator (); i.hasNext (); ) { final String address = (String) i.next (); final int count = ((int[]) counts.get (address))[0]; System.out.println (address +"--- "+ count +"人"); } 一応テストもしました。
その他の回答 (3)
- covachan
- ベストアンサー率38% (46/120)
補足ですが、 もちろん、このやり方では、システムの負担や、名前でSutudentを引くようなことはできなくなります。 1の方が言うようにDBでやるのがベストでしょう。
- covachan
- ベストアンサー率38% (46/120)
List studentList = new ArrayList(); ここのところ、 Listではなく自分でクラスを作ってみてはどうですか? つまり、 内部でHashMapの中にArrayListを配列で持つ器をつくり、住所をキーにして生成したArrayListをHashMapにputしていくというような・・・ 簡単に書くと、 HashMap hash = new HashMap(); void add(Student student){ if(containsKey(student.getAddress())){ ((ArrayList)hash.get(student.getAddress())).add(student); }else{ ArrayList list = new ArrayList(); list.add(student); hash.put(student.getAddress(),list); } } こうすれば、ArrayListのサイズを調べるだけですみます。
- chi-kon
- ベストアンサー率43% (58/132)
DBつかってやったほうがはやいんじゃないですか? 1と2ができあがっているとのことですが、 目的の機能ができてないのだから1,2もできてないってことで作り変えたほうがいいんじゃないでしょうかね。 それでもこれでやりたいっていうなら Listのなかをいっこいっここじ開けて if文できいて集計していくしかないのではないでしょうか? 集計するのが目的なら Listにaddするまえにカウントしてからaddするか 地域ごとに別のListをつくってサイズをみたほうがいいのではないでしょうか?