• ベストアンサー

アルファベットのソート

Javaでクイックソートを使って、アルファベットを昇順に(スペースより小文字の方が大きい、小文字より大文字のほうが大きいものとする)並べ替えたいのですが、比較方法がよくわかりません。ご教授お願いいたします。 入力は、キーボードからの入力でchar型配列です。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

//#3を若干修正したバージョン for JAVA 1.5 import java.util.Arrays; import java.util.Comparator; //import java.lang.Character; //[A-Z]は[a-z]より大きい class MyCharSort implements Comparator<Character> { public static void main(String args[]){ char inpData[] = {'A','b','z','Q',' ','R','Z','H','A'}; Character data[] = new Character[inpData.length]; for(int i=0;i<inpData.length;i++){ data[i]=new Character(inpData[i]); } Comparator<Character> cmp=new MyCharSort(); Arrays.sort(data, cmp); for(Character c : data){ System.out.println(c.charValue()); } } public int compare (Character ch1, Character ch2) { char c1=ch1.charValue(), c2=ch2.charValue(); if(Character.isUpperCase(c1) && Character.isLowerCase(c2)) return ( 1); if(Character.isLowerCase(c1) && Character.isUpperCase(c2)) return (-1); return (ch1.compareTo(ch2)); } }

shoutan0630
質問者

お礼

とても丁寧なご回答ありがとうございます。 早速、参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

1. charは整数型ですので、大小が比較できます。 例: char a = 'a'; char b = 'b'; System.out.println("a:"+(int)a+",b:"+(int)b); とすると分かるかと思います。 2. 次に大文字、小文字の判定ですが… 1.を応用すれば比較できます。 [a-z],[A-Z]の整数値を出力してみれば、大文字と小文字の範囲が分かるので、 小文字の最小値以上かつ小文字の最大値以下なら小文字 大文字の最小値以上かつ大文字の最大値以下なら大文字 1.と2.を組み合わせれば比べる2つの文字が大文字か小文字を判定して、さらに大文字内での大小比較、小文字内での大小比較をすればいいと思います。 もし、クイックソートのアルゴリズムについて知りたければ、検索すれば沢山ひっかかるでしょうし、javaのサンプル(demoの下)にもQSortAlgorithm.javaというクラスがあるので、参考にしてみるのもいいかもしれません。

shoutan0630
質問者

お礼

わかりやすいご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

[A-Z]は[a-z]より大きい、というのを踏まえて、ソートする部分を作るのはイヤなので、比較関数だけ作ってArrays.sortを利用しようとするサンプル。 メソッド compare の部分がほぼ#1で説明していることそのまま。 この場合のソートはマージソート(なので質問文の要求とは異なる) #2の説明Array.sortはArrays.sortの間違い どうも、望んでいるモノと違うという場合には、 質問者の作成したソースを補足で挙げて下さい。 私自身、java は、勉強中なので、変なソースかもしれないことをおことわりしておきます。 ------8<-------8<--------8<-------- import java.util.Arrays; import java.util.Comparator; //import java.lang.Character; //[A-Z]は[a-z]より大きい class MyCharSort implements Comparator { public static void main(String args[]){ char inpData[] = {'A','b','z','Q',' ','R','Z','H','A'}; Character data[] = new Character[inpData.length]; for(int i=0;i<inpData.length;i++){ data[i]=new Character(inpData[i]); } Comparator cmp=new MyCharSort(); Arrays.sort(data, cmp); for(Character c : data){ System.out.println(c.charValue()); } } public int compare (Object o1, Object o2) { Character ch1=(Character)o1, ch2=(Character)o2; char c1=ch1.charValue(), c2=ch2.charValue(); if(Character.isUpperCase(c1) && Character.isLowerCase(c2)) return ( 1); if(Character.isLowerCase(c1) && Character.isUpperCase(c2)) return (-1); return (ch1.compareTo(ch2)); } }

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

キーボードからの入力は、char data[]に入っているとして入力部分は省略した。 普通にArray.sort(クイックソート)を使用するサンプル ------8<--------8<-------8<----------- import java.util.Arrays; class CharSort { public static void main(String args[]){ char data[] = {'A','b','z','Q',' ','R','Z','H','A'}; Arrays.sort(data); for(char c : data){ System.out.println(c); } } }

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

単純にソートするだけなら、java.util.Arraysのsortでできますが、 「小文字より大文字のほうが大きいものとする」と言うところが普通とは違うので自作しなければならないということでしょうね。 2つのchar型を比較するメソッド(関数)で、まず、種類(大文字か小文字か)で比較が決まればその結果を返し、種類が同じなら単に大小比較をすればいいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列のソートがしたい

    sort関数等調べたのですがうまくできません。 やりたいことは http://q.hatena.ne.jp/1155090363 ↑で見つけた事とそっくりなのですが・・・。 ------------------------------------------- arrItem[n] という配列の一つの要素の中に、 タブで区切られた10個程のデータが入っています。 arrItem[0] = "5 ^ 店名5 ^ 品名5 ^ 価格5 ^ 割引額5 ^・・・^ 備考5" arrItem[1] = "2 ^ 店名2 ^ 品名2 ^ 価格2 ^ 割引額2 ^・・・^ 備考2" arrItem[2] = "11 ^ 店名9 ^ 品名9 ^ 価格9 ^ 割引額9 ^・・・^ 備考9" 一列目はSEQ番号でユニークですが、順番が並んでいません。 この配列をSEQ番号で並べ替えたいのですが、 sortだと文字列比較のためか桁数の違う数字の並べ替えが 上手くできません。数値としてのソート方法 が分かる方いらっしゃいましたらご教授願います。 もし可能なら、1列目を数値降順にしたり昇順にしたり、 また2列目を五十音順にソートしたり、 また4列目を価格の安い順にソートしたり と応用も可能ならばご教授願いたいです。 宜しくお願い致します。

  • ソートで

    get().sort(function() { return Math.round(Math.random()) - 0.5; }) はどういう意味ですか? ソートを return Math.round(Math.random()) - 0.5; でするようですが、 ランダムな数字を出してどうやってソートされるのですか? ソートは文字でか数値ででないのですか? http://memopad.bitter.jp/w3c/jsref/jsref_sort.html では >フォルトで、要素をアルファベットの昇順にソートします。 しかし、数値が正しくソートされません(40が5の前に来ます)。 数値をソートするためには、数を比較する関数を追加しなければなりません。 となっています。 ランダムな数字でソートはできるのですか? 使う意味を教えて下さい。 それから、-0.5をしてるのはどういう意味でしょうか?

  • 構造体配列のクイックソート

    こんにちわ。 構造体配列のリストを ポインタのつなぎ変えによるクイックソートで 以下のようなソートをしたいのですが、悩んでおります。 struct info { int count; struct info *prev; struct info *next; }; int main () { struct info info[5]; /* 初期値設定 */ quick_sort(info, 0, 5); return 0; } 上記のようにして、クイックソートをしたいのですが、 よくあるクイックソートだと 例えば初期値を <配列のindex>要素の値を <0> <1> <2> <3> <4> 5 1 4 3 2 などと定義した場合 普通のクイックソートだと <0> <1> <2> <3> <4> 1 2 3 4 5 というように並び変えられてしまい <配列のindex>と 要素の値の組み合わせが変わってしまいますが、 この組み合わせを変えず、 struct info *if; if = info; for (i=0; i<MAX; i++){ printf("%d", if->count); if = if->next; } printf("\n"); とすることで、indexとしては昇順になっていないが *nextをたどっていくことでちゃんと目的の値の昇順になっている というのを実現したいのですが、ポインタのつなぎ変えか何かが 間違っているようで うまいことできていません。 どなたかご教授いただけますでしょうか。 申し訳ありませんが、よろしウお願いいたします。

  • クイックソートがうまくいかない

    クイックソートとはこういう仕様のソートのことです。 (1)バラバラの配列から基準値を設定する。 (2)前から順番に辿って行って基準値よりも大きいならば、基準値よりも後に移動、小さいならば、基準値よりも前に移動させる。(私のプログラムの場合は基準値を配列の一番目の数に設定しています。) (3)小さいほうと大きいほうの二つのグループに分かれたらまたそれらのグループごとにクイックソートにかける。 (4)二つのグループを分けることができなくなればソート完了。 自分で確かめてみたのですが、どうやら関数QuickSortの中でさらに再帰的にQuickSortにかけるときにバグが発生しているようです。ですが、なぜバグが起きるのかわかりません。 お手数ですが、よろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define N 10 void QuickSort(char mi,char *hai,int youso) { char *shoubox; char *bigbox; int k=0; int q=0; int i,len,len2; /*もし配列haiの大きさが1ならば終了*/ if(strlen(hai)==1) { return; } /*配列の2番目から最後まで基準値からの大小により仕分けしていく。大きいならば、配列bigboxに小さい*/ /*ならば配列shouboxにそれぞれ入れる。*/ for(i=1;i<youso-1;i++) { if(hai[i]>mi) { bigbox[k++]=hai[i]; } else { shoubox[q++]=hai[i]; } } /*仕分け処理はここまで*/ /*小さいほうの配列と大きいほうの配列をそれぞれクイックソートにかける再帰処理。*/ QuickSort(shoubox[0],shoubox,q); QuickSort(bigbox[0],bigbox,k); /*それぞれのソートが完了したら、配列haiに「小さいほうの配列」→「基準値」→「大きいほうの配列」 の順に値を代入していく。*/ len=strlen(shoubox); for(i=0;i<len;i++) { hai[i]=shoubox[i]; } hai[len]=mi; len2=strlen(bigbox); for(i=(len+1);i<len+len2;i++) { hai[i]=bigbox[i]; } /*代入処理ここまで。*/ } int main(void) { char array[N]; char m; int i,val,j; srand(time(NULL)); /*(1~10)までの数字をランダムに入力する処理*/ for(i=0;i<N;i++) { do{ val=rand()%10; for(j=0;j<i;j++) { if(val+'0'==array[j]) { break; } } }while(j<i); array[i]=val+'0'; } /*ランダムに値を入力する処理ここまで*/ m=array[0]; /*値配列の最初を基準値mに設定*/ QuickSort(m,array,N); /*基準値、配列、要素数を実引数として、クイックソートを呼び出す。*/ /*昇順に並べ替えた配列arrayを出力する。*/ for(i=0;i<N;i++) { printf("array[%d]=%c\n",i,array[i]); } return 0; }

  • インデックスソート

    Javaに、インデックスソートを実行するライブラリーはありますか? 例えば、  {24,16,12,11,18,16} の入力に対して、昇順ソートしたときのインデックス位置  {3,2,1,5,4,0} を出力してくれるようなライブラリを探しています。 どなたか、ご存じないでしょうか? 以上、よろしくお願いいたします。

  • java ソート

    java ソート ソートプログラムを作ってみましょう ? double型の配列とメソッドを持つクラスを定義 ? コンストラクタで配列を初期化(0.0で初期化) ?配列を昇順,降順に並び替えるメソッドを持つこと ? 2種類のメソッドを持っても良い ? 引数の値で変えても良い ? ソート済み配列をチェックするメソッドを持つこと ? 1000000要素程度のソーティングで時間計測 課題です 全く手が出せず困ってます・・・。 ヒント、手順、解答 なんでも良いので、救いの手をお願いします!!

  • クイックソートの比較回数について

    中央値をピボットとするクイックソートで、入力データ数が1024で昇順データの場合はO(nlogn)の関係より10240回の比較回数が得られる、というのは合っているでしょうか? ご回答お願い致します。

  • クイックソートがうまくいかない

    クイックソートの仕様はこうです。 (1)バラバラにランダムで入力した配列から基準値を設定する。 (2)前から順番に辿って行って基準値よりも大きいならば、基準値よりも後に移動、小さいならば、基準値よりも前に移動させる。(私のプログラムの場合は基準値を配列の一番目の数に設定しています。) (3)小さいほうと大きいほうの二つのグループに分かれたらまたそれらのグループごとにクイックソートにかける。 (4)二つのグループを分けることができなくなればソート完了。 動作させてみたところ関数QuickSortの中の「基準値より大きいか小さいかの仕分けの処理」の後で、再帰処理があるのですが、再帰ではなく無限ループになってしまっているようです。 自分では、この処理で無限ループをとめているつもりです。 if(youso==1) { return; } なぜこのようになってしまうのでしょうか お手数ですが、よろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define N 10 int k,q; void QuickSort(char mi,char hai[10],int youso) { char shoubox[10]; char bigbox[10]; int i,len,len2; k=0,q=0; /*もし配列haiの大きさが1ならば終了*/ if(youso==1) { return; } /*配列の2番目から最後まで基準値からの大小により仕分けしていく。大きいならば、配列bigboxに小さい*/ /*ならば配列shouboxにそれぞれ入れる。*/ for(i=1;i<youso;i++) { if(hai[i]>mi) { bigbox[k++]=hai[i]; } else { shoubox[q++]=hai[i]; } } /*仕分け処理はここまで*/ /*小さいほうの配列と大きいほうの配列をそれぞれクイックソートにかける再帰処理。*/ QuickSort(shoubox[0],shoubox,q); QuickSort(bigbox[0],bigbox,k); /*それぞれのソートが完了したら、配列haiに「小さいほうの配列」→「基準値」→「大きいほうの配列」 の順に値を代入していく。*/ len=strlen(shoubox); for(i=0;i<len;i++) { hai[i]=shoubox[i]; } hai[len]=mi; len2=strlen(bigbox); for(i=(len+1);i<len+len2;i++) { hai[i]=bigbox[i]; } /*代入処理ここまで。*/ } int main(void) { char array[N]; char m; int i,val,j; srand(time(NULL)); /*(1~10)までの数字をランダムに入力する処理*/ for(i=0;i<N;i++) { do{ val=rand()%10; for(j=0;j<i;j++) { if(val+'0'==array[j]) { break; } } }while(j<i); array[i]=val+'0'; } /*ランダムに値を入力する処理ここまで*/ m=array[0]; /*値配列の最初を基準値mに設定*/ QuickSort(m,array,N); /*基準値、配列、要素数を実引数として、クイックソートを呼び出す。*/ /*昇順に並べ替えた配列arrayを出力する。*/ for(i=0;i<N;i++) { printf("array[%d]=%c\n",i,array[i]); } return 0; }

  • sortコマンドについて

    33 333 22 33 333 33 33 333 11 33 222 11 33 111 11 44 111 11 44 222 11 11 111 11 11 222 11 上記のファイルを以下のようにソートしたいのですが どのようにすればよいでしょうか? 第一ソートキー 1~2番目の昇順 第二ソートキー 4~6番目の降順 第三ソートキー 8~9番目の昇順 (ちなみにspaceはたまたまspaceで区切り文字ではありません) 11 222 11 11 111 11 33 333 11 33 333 22 33 333 33 33 222 11 33 111 11 44 222 11 44 111 11 以下の試して見ましたがうまくいきませんでした。 sort -k 1.1,1.2 -r -k 1.4,1.6 -k 1.8,1.9 test.txt 宜しくお願い致します。

  • qsort/クイックソートについて

    構造体の配列をqsortで昇順に並び替えるプログラムを作成しています。 対象は数値項目で、単純にNo順に並び替えるイメージです。 クイックソートは、配列の内容によって処理時間が変わると聞いたので、一番遅くなる場合の時間を調べたいのですが、どのような並びだと一番遅くなるのでしょうか?