多次元配列のソートがうまくいかない
質問失礼します.
以下のような,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 ] ) );
}
}
No.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;
}
}
回答ありがとうございます.
わざわざサンプルまで書いていただいて大変参考になりました.
まさに自分がやりたかった処理が実行できました.
どうもありがとうございます!
No.2
- 回答日時:
文字列をソートしているからです。
数値順にソートしたいのならば数値型にしてソートしなければだめです。
もしくは0パディングして桁数を合わせてから比較するようにすればいいです。
回答ありがとうございます.
たしかにソートの際にString型で行っていました.
はずかしながら確認があまかったです.
どうもありがとうございます.
No.1
- 回答日時:
「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 …
回答ありがとうございます.
ソートがうまくいかない箇所を細かく説明していただいて助かります.
とても参考になり,おかげで原因がわかりました.
どうもありがとうございます.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列をセッションに割り当てた後で
-
JavaBeansの配列の値取得方法に...
-
多次元配列はなぜ必要???
-
ページング
-
ArrayListからBean配列に値をセ...
-
csvファイルを2次元配列に格納
-
String[] とVectorの使い分け
-
sqlparamaterでIN句を使いたい。
-
C言語でunsigned char配列を連...
-
無名配列の作成方法について質問
-
配列で、値の入っている要素数...
-
n番目に大きな値を探索する
-
配列について
-
Javaで文字と数字が混ざったも...
-
main(String[] args) の args...
-
javaの問題
-
配列の中で入れ換えをして逆順...
-
javaでEUC-JP文字列→UTF-8への変換
-
配列の中に複数存在する数がい...
-
Java 配列に1から25以外の値が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
[Ljava.lang.Stringってなんですか
-
この警告はどうすれば?
-
Java配列の問題を教えてくださ...
-
配列の中に複数存在する数がい...
-
配列で、値の入っている要素数...
-
java
-
『args[]』とは?
-
javaで大容量テキストファイル...
-
C#で動的配列Listの中身をListB...
-
csvファイルを2次元配列に格納
-
Javaで文字を漢字であるか否か...
-
フローチャート
-
javaについて
-
【C#】ハッシュテーブル(連想...
-
セッションを使ったint型の値の...
-
C言語でunsigned char配列を連...
-
配列について
-
n番目に大きな値を探索する
-
cloneメソッドについて (java)
おすすめ情報