- ベストアンサー
多次元配列のソートがうまくいかない
- 質問失礼します。多次元配列をソートするプログラムを作成しましたが、一部の項目が一桁と二桁の場合、ソートが正しく行われない問題が発生しています。
- 原因がわからず困っているので、解決策を教えていただきたいです。
- プログラムのコードとソート実施の部分を示しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
原因は他の方が述べている通り文字列辞書順で並び替えが行われていることだと思います。 違った観点でのご提案ですが、String、int、doubleを格納するクラスを一つ作るという実装ではだめなのでしょうか? (多次元)配列はもともと同じ型の要素が入ることを前提だと思いますので、要求の機能とは親和性が低いように思えます。 違った型の要素が動的に増減するとなると話は別ですが... 以下に変更した例を記載致します。 public class Sort_test { public static void main(String[] args) { StrIntDbl[] array = new StrIntDbl[3]; array[0] = new StrIntDbl("A", 2001, 9.0); array[1] = new StrIntDbl("B", 3001, 2.0); array[2] = new StrIntDbl("C", 1001, 6.0); StrIntDblComparator comparator = new StrIntDblComparator(StrIntDblComparator.STR); Arrays.sort(array, comparator); dump(array); } public static void dump(StrIntDbl[] array) { for (int i = 0; i < array.length; i++) { System.out.print("\t" + array[i].s); System.out.print("\t" + array[i].i); System.out.print("\t" + array[i].d); System.out.println(); } } } class StrIntDblComparator implements Comparator<StrIntDbl> { private final int key; public final static int STR = 0; public final static int INT = 1; public final static int DBL = 2; public StrIntDblComparator(int key) { super(); this.key = key; } public int compare(StrIntDbl o1, StrIntDbl o2) { switch (key) { default: case STR: return o1.s.compareTo(o2.s); case INT: return o1.i - o2.i; case DBL: return (int)(o1.d - o2.d); } } } class StrIntDbl{ String s; int i; double d; public StrIntDbl(String s, int i, double d) { super(); this.s = s; this.i = i; this.d = d; } }
その他の回答 (2)
- yamada_g
- ベストアンサー率68% (258/374)
文字列をソートしているからです。 数値順にソートしたいのならば数値型にしてソートしなければだめです。 もしくは0パディングして桁数を合わせてから比較するようにすればいいです。
お礼
回答ありがとうございます. たしかにソートの際にString型で行っていました. はずかしながら確認があまかったです. どうもありがとうございます.
- hideishi
- ベストアンサー率55% (5/9)
「String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました。」 とのことですが、比較ハンドラ compare では、String型で比較を行っています。 従って、array[][2] の比較は、String型で行われます。 例えば、"9.0","70.0", "6.0" を StringクラスのcompareToメソッドで比較すると、文字列長は短い方に合わせて 比較しますから、"9.0","70.0", "6.0" の比較は、"9.0","70.", "6.0" の比較となり、 compareToは、辞書式比較ですから、比較結果は、 "6.0" < "70." < "9.0" なります。 比較ハンドラ compare で比較を行う際には、データ型に合わせた比較、array[][2]の比較であれば String型をdouble型に変換して比較するなどの処置が必要です。
- 参考URL:
- http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.html#compareTo(java.lang.String)
お礼
回答ありがとうございます. ソートがうまくいかない箇所を細かく説明していただいて助かります. とても参考になり,おかげで原因がわかりました. どうもありがとうございます.
お礼
回答ありがとうございます. わざわざサンプルまで書いていただいて大変参考になりました. まさに自分がやりたかった処理が実行できました. どうもありがとうございます!