J2SDK1.42 ArrayList ソート方法とは?

このQ&Aのポイント
  • J2SDK1.42のArrayListを使用してデータをソートする方法について教えてください。
  • 年の順にソートしたいデータをArrayListで扱っていますが、どのようなプログラムを組めば良いでしょうか?
  • CSV形式の元データを配列に格納してソートや絞り込みができる方法も教えてください。
回答を見る
  • ベストアンサー

J2SDK1.42 ArrayList ソート?

ソートの仕方を教えてください。 下記のようなデータを年の順でソートしたいのですが。 格データを配列などで扱っているとしたらどのようなプログラムを組めばよいのでしょうか教えてください。 渡辺 50歳 埼玉県 鈴木 21歳 神奈川県 佐藤 40歳 沖縄県 array1 = new ArrayList();'array.get(0)が名前、array.get(1)が歳 array2 = new ArrayList(); array3 = new ArrayList(); などでは、歳をキーにしてSort()する方法はないのでしょうか? ほかによい方法があれば教えてください。 元データはCSVで配列などにいれてソートや絞込みが行えるようにしたいのですが。 以上よろしくお願いいたします。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

Collections#sortを使えば簡単だと思います。 現状のデータが入ったリストをリストにしても問題なりと思いますが、 簡単に記載する為、Beanのリストで説明します。 new Bean('渡辺',50,'埼玉県'); のgetter/setterのあるBeanを人数分作成してListか何かに詰め込みます。 for (int i=0;i<hoge.length;i++){ list.add(new Bean(hoge[0],hoge[1],hoge[2])); } それで、並び替えを行う為sortメソッドに投げ込みます。 Collections.sort(list,new BeanComparator()); ここで、BeanComparatorが出てきましたが、ここにソートする内容を 記載します。内部クラスなどにしちゃえばOKです。 public class BeanComparator implements Comparator { public int compare(Object arg1, Object arg2) { Bean bean1 = (Bean) arg1; Bean bean2 = (Bean) arg2; return new Integer(bean1.getAge()).compareTo(new Integer(bean2.getAge())); } } こんな感じですね。compareメソッドの引数にリストに登録した内容 が入ってきます、それを取り出しキャストして年(getterをAgeと設定) を比較しています。 これは、昇順にしていますが、降順にする場合は、returnするときに *-1してあげれば大丈夫だと思います。 わからない場合は、 Collections Comparator ソート ぐらいでググれば結構ヒットすると思います。 がんばってください。

Radhiant
質問者

お礼

Comparatorについてはすでに調べていたのですが、頭が固いようで… 要素や項目が増えると混乱してしまいました。 非常にわかりやすい回答ありがとうございました。 後は実際に使いながら学んでみます。

関連するQ&A

  • ソートについて

    以下のプログラムを実行すると整数のソート結果が "1","12","3"となってしまいます。 整数と文字列を分離させてそれぞれソートさせたいのですが 方法がわかりません。 import java.util.*; import java.io.*; class StrArray{ ArrayList list = new ArrayList(); //最下行に要素を追加 public void add(String data){ list.add(data); } //全ての要素を配列で所得 public String[] getAll(){ String[] all = new String[list.size()]; for(int i=0; i<list.size(); i++){ all[i] = super.get(i); } return all; } public static final int ASC_SORT = 0; public void sort(int mode){ ArrayList al = this.qsort(mode, list); al = list; } //クイックソート public ArrayList qsort(int mode, ArrayList data){ ArrayList result = new ArrayList(); if(data.size()<1){ return new ArrayList(); } String middle = (String)data.get(data.size()/2); ArrayList left = new ArrayList(); ArrayList right = new ArrayList(); for(int i=0; i<data.size(); i++){ if(i != data.size()/2){ if(mode == 0){ if(((String)data.get(i)).compareTo(middle)<=0){ left.add(data.get(i)); } else{ right.add(data.get(i)); } result.addAll(qsort(0, left)); result.add(middle); result.addAll(qsort(0, right)); return result; } return result; } } } } class Sample{ public static void main(String args[]){ StrArray alist = new StrArray(); alist.add("bbb"); alist.add("aaa"); alist.add("ddd"); alist.add("ccc"); alist.add("3"); alist.add("1"); alist.add("12"); alist.sort(0); String[] info = alist.getAll(); for(int i = 0; i < info.length; i++){ System.out.println(info[i]); } } }

  • ArrayListクラスのインスタンスの宣言について

    まず初めに一言。 今自分が使用している本は3年ぐらいのモノです。 なので、宣言の仕方が変わっているかもしれません。 その上で質問です。 まず、ソースコードを貼り付けます。(JSP) <%@ page language="java" contentType="text/html; charset=Shift_JIS" import=java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>配列の挿入、削除(ArrayList)</title> </head> <body> <% //配列を定義する ArrayList array = new ArrayList(); //値をセットする array.add("1111"); array.add("2222"); array.add("3333"); //配列の値を表示する for (int i=0; i<array.size(); i++) { System.out.println("<p>" + (i+1) + "番目:" + array.get(i)); } //値を挿入する array.add(2, "9999"); //3番目の値を削除する array.remove(2); //変更後の配列の値を表示する for (int i=0; i<array.size(); i++) { out.println("変更後" + (i+1) + "番目:" + array.get(i)); } %> </body> </html> ArrayListクラスのインスタンスの宣言はどこか間違っているでしょうか。 Eclipse曰く、 『ArrayListはraw型です。ArrayListの参照はパラメータ化する必要があります。』 という警告が表示されます。 エラーでは無いみたいなのですが、やはり警告されている状態を放っておくのはあまり気持ちいいモノではありません。 そこで、質問です。 この警告を消す方法はあるのでしょうか。 もし、あるのでしたら教えて頂けると幸いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java
  • ArrayListに多次元配列

    ArrayListに多次元配列の変数を格納したのですが、取り出し方がわからず困っています。 ----------------------------------------------- String[][] str = {{"aaa","bbb","ccc","ddd","eee","fff"}, {"aaa","bbb","ccc","ddd","eee","fff"}, }}; ArrayList array = new ArrayList(); array.add(str[0]); array.add(str[1]); ----------------------------------------------- 上記の場合で、str[0][2];を取得する方法がわかりません。 java初心者なのでおかしな質問かもしれませんが、宜しくお願いします。

    • ベストアンサー
    • Java
  • pwshでArrayListの作り方について

    PowershellでExcelに書き込むにはいろいろ方法がありますが、今回は、csvファイルをStreamReaderで読込みArrayListでデータとしそのデータをExport-ExcelでExcelに書き込む仕様についてです。残念なことに勉強がてら作った下記のコードでは、excelにスペース区切りのまま書き出されます。 # CSVファイルをExcelにインポートするスクリプト $fileName = "D:\test\pp010.csv" # CSV ファイルをオープンする $reader = New-Object System.IO.StreamReader($fileName, [System.Text.Encoding]::GetEncoding("utf-8")) $data = @() $data = New-Object System.Collections.ArrayList while ($reader.Peek() -ge 0) { $line = $reader.ReadLine() # 行ごとの処理を行う $fields = $line.Split(",") # 数値カラムの区切りが無くなり一体化するのを防止 $data.add("${fields}") } # 配列に変換・・今回は不用 #$str = $data.ToArray().Split("`t") $data | Export-Excel -Path "D:\test\AAA.xlsx" $reader.Close() これは StreamReaderで読込みArrayListでデータを作るところに問題があります $data = Import-Csv -Path $csvFilePath で読み込んだ場合は、問題なく書き込まれます。 ArrayListの使う方法は検索の仕方が下手なのかよく分からないの現状ですし使っていいものかも分かっていません。ただ、StreamReaderを使いExcelのセルに順次書き込む方法では処理時間が掛かること(前に質問しましたが解決に至りませんでした。)に対して短縮方法の手段として考えてみただけです。 解決の方法があればお教えください。

  • ArrayListへArrayListの格納

    お世話になっております。 ArrayListを2つ使用して2次元配列のような事をしようとしております。 データベースから取得したデータの1行をArrayListItemへ格納してそのArrayListItemをArrayListRecordへ格納しようとしております。 追加し終わり最後にArrayListRecordの中身を見ると全て一番最後のデータで置き換わっています。 どなたかご存知でしたらお教え願います。 ' 変数宣言 Dim objSqlDR As SqlDataReader Dim alSetItem As ArrayList Dim alSetRecord As ArrayList alSetItem = New ArrayList alSetRecord = New ArrayList ' データ取得分ループ While objSqlDR.Read()  alSetItem.Clear()  For intSetIndex = 0 To (objSqlDR.FieldCount - 1)   alSetItem.Add(objSqlDR(intSetIndex))  Next intSetIndex  alSetRecord.Add(alSetItem) End While

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 関数で定義した配列のソート

    お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。

  • JAVA LIST ソート

    JAVA LIST ソート JAVAの初心者です。よろしくお願いします。 検索結果の一覧画面のデータを SORT ボタンをクリック時、JAVA側で セッションBEANに保持してる 画面一覧のLISTデータをあるキーでソートしたいですが、 わからなくて困ってます。 自分なり考えたのは、 ArrayList list = new ArrayList(); List.add(getSessionBean());ーーーセッションBEANのデータをリストに追加 Collections.sort(list, new MyComparator() ここで MyComparator()での書き方がよくわかりません。 もし、ソートキーが 複数あれば どうなりますか? サンプルなどがあれば、ご教授頂ければ幸いです。

  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java
  • ArrayListによる計算表作成

    for文を使用し九九の計算結果を配列に格納し、その配列内の情報を表形式で表示してみる。※配列はArrayListを使用すること 上記の問題を解いています。 -------------------------------------------------------------- import java.util.ArrayList; public class m4_2 { public static void main(String args[]) { ArrayList list = new ArrayList(); String[]s = new String[9]; for(int i = 1; i<=s.length; i++){ for(int j =1; j<=s.length; j++){ list.add((i * j));     //ここがどのように記述するか?? } System.out.print(list.get(0)); System.out.print(list.get(1)); System.out.print(list.get(2)); System.out.print(list.get(3)); System.out.print(list.get(4)); System.out.print(list.get(5)); System.out.print(list.get(6)); System.out.print(list.get(7)); System.out.print(list.get(8)); System.out.print("\n"); } } } ---------------------------------------------------------- 実行結果イメージ 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 (以下省略) 私の書いたソースでは1の位しか計算してくれません。 今月から本格的にJavaを勉強し始めた初心者なので どうかよろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう