• ベストアンサー

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
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
回答No.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)
回答No.3

補足ですが、 もちろん、このやり方では、システムの負担や、名前でSutudentを引くようなことはできなくなります。 1の方が言うようにDBでやるのがベストでしょう。

  • covachan
  • ベストアンサー率38% (46/120)
回答No.2

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)
回答No.1

DBつかってやったほうがはやいんじゃないですか? 1と2ができあがっているとのことですが、 目的の機能ができてないのだから1,2もできてないってことで作り変えたほうがいいんじゃないでしょうかね。 それでもこれでやりたいっていうなら Listのなかをいっこいっここじ開けて if文できいて集計していくしかないのではないでしょうか? 集計するのが目的なら Listにaddするまえにカウントしてからaddするか 地域ごとに別のListをつくってサイズをみたほうがいいのではないでしょうか?

関連するQ&A

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

    • ベストアンサー
    • 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インターフェースの使用法

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

  • 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
  • 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データを重復せずに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
  • 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

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • ListにDialogを格納して閉じたら削除 C#

    Visual C# で複数のモードレスダイアログを表示させ、 一括で最前面表示の有効・無効を切り替えるために List配列にインスタンスを格納しました。 ・Form1 public List<MyDialog1> dialogList = new List<MyDialog>(); ・ボタンのクリック時 MyDialog dialog = new MyDialog(); dialogList.Add(dialog); 動作としては問題なかったのですが、ダイアログを閉じた際 リストからそのダイアログのインスタンスを削除したいのですが、 どのようにすればいいのでしょうか? 現状わからない点は、ダイアログのクラスからオーナーのFormのプロパティにアクセスする方法と、 リスト内のインスタンスのうち、閉じるイベントを発生させたのはどのインスタンスであるかを区別する方法です。