• 締切済み

Java バブルソート

テキストファイルに文字が書き込まれていて、その文をASCIIコード順に並び替えるのですがStringからintに変換してバブルソートを行えばよろしいのでしょうか 詳しくお願いいたします 1行は10文字  50行までです 別ファイルに書き込みます sample1.txt cfd cad fa sample2.txt ・・・ ・・・

  • Java
  • 回答数6
  • ありがとう数0

みんなの回答

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.6

ソートには比較関数が必要ですが、厳密な意味で ASCII 順に並び替えるのは少々面倒なので 上位互換である Unicode(UTF-16) 順に並び替える String#compareTo で代用しましょう http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#compareTo(java.lang.String) このメソッドは、文字列を「Unicode値の順番で辞書的に」比較します 辞書的とは、辞書における項目の並べ方の様なルールです 1. 文字を UTF-16 コード値(≒ASCII)にした場合に、値が小さいほうを先にする 2. n 文字目が同じなら、n+1 文字目で判断する 3. 文字数が異なるなら、短いほうを先にする 以下サンプルです 昨今は富豪的プログラミングでもなんら問題ないので、10文字とか50行とかの制限は考慮しません String[] lines = sample1から行単位に全部読み取り(); for (int i = 0; i < length-1; i++) { for (int j = i+1; j < length; j++) { if (lines[i].compareTo(lines[j]) > 0) { linesのiとjを入れ替える処理(); } } } sample2に行単位に全部書き込み(lines); // 実行結果の例 // cad ← 次行と比べて、2文字目が 'a' U+0061 < 'f' U+0066 // cfd ← 次行と比べて、1文字目が 'c' U+0063 < 'f' U+0066 // fa ← 次行と比べて、2文字目まで同じだが文字数が短い // faa

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.5

sample1.txt adw31rk wd24 r1t4 を adw31rk r1t4 sample1.txt wd24 でよければno1の比較で良いです。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.4

>ASCIIコードを基準にソートするということです 文字コードで並べているので、ASCIIファイルならASCII順になりますよ。 EBCDICファイルならEBCDICコード順になります。

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.3

>テキストファイルに<文字>が書き込まれていて 文字ソートでいいんでしょ? c e b だったら b c e になります。 99 101 98 を数字ソートしたいのですか? あなたの例は文字ソートですが?

keibagt
質問者

補足

ASCIIコードを基準にソートするということです 99とか数字を出したのは例です

回答No.2

元のファイルがASCIIコードのファイルであればInputStreamReaderでUS-ASCIIでint配列に読み込んでベタに比較するのが王道でしょう。 英字の範囲であればASCIIもUNICODEも同じ並びなのでStringのcompareToでも行けるはずです。 まあ、ASCIIなんて環境依存するファイルは扱いたくはないですね。UNICODEファイルにすることをお勧めします。

keibagt
質問者

補足

半角英数字のテキストファイルです sample1.txt adw31rk wd24 r1t4 といった場合です この場合、rとwを比較と言うのはどのようにすればよろしいのでしょうか

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

if(str1[x].compareTo(str1[y])>0) { String tmp=str1[x]; str1[x]=str1[y]; str1[y]=tmp; } String で比較して入れ替えるだけですよ。

keibagt
質問者

補足

ASCIIコード順ですよ a[0]c 99 a[1]e 101 a[2]b 98 となっていたらバブルソートで小さいものから並び替えます これを10文字までできるプログラムです Yama Kai だったら YとKで比較してASCIIコードの小さいものに並び替えます

関連するQ&A

  • java ソーティング バブルソート 昇順

    Javaです テキストファイルを読み込み、ソーティングしてから書き込む ソーティングはバブルソートで行う テキストファイルは50行まで一行は10文字以内 読み込み書き込みはプログラム内で行う 半角英数字のみのテキストファイルとからのテキストファイルを用意する (ASCIIコードで昇順) 入力ファイル 1231 1f23 出力ファイルは 1231 ・・・・

  • 文字数順にソートするには

    テキストファイルの行を文字数順にソートしたいのですが、 sort コマンドを使って行うことはできないのでしょうか? $ perl -e 'print for sort { length $a <=> length $b } <>' foo.txt でもいいのですが、行数が膨大なため、できるだけ早く処理したいと思っています。 もし何か方法がありましたら教えてください。お願いします。

  • ソートのプログラム

    100個の整数をファイル「int.txt」から出力して小さい順にソートして「out.txt」に書き込むC言語のプログラムなんですけど、自分で何回やってもできないのでどうか教えてください。

  • C言語の構造体にてバブルソートが上手くいきません‥

    C言語の構造体にてバブルソートが上手くいきません‥ 初めて質問致します。 以下は、構造体で、身長順にバブルソートを行うソース文ですが、 結果表示が、最下部に示したように、 5つのレコードのうち1つが消えてしまい、 残った4つのレコードのうちの1つが重複されて表示されてしまいます。 これが、なかなか解決できません‥。 既に結構調べており、また、早く解決できないといけないこともあり、 すみませんが、回答の形式でお願いできますと大変幸いです。 何卒よろしくお願い致します。 #include<stdio.h> #include<string.h> typedef struct kojin { char name[21]; int length; int weight; }KOJIN; int main(void) { int i, c, j; char buf[4]; KOJIN data[10]; KOJIN *d; printf(

  • ソート

    読み込むファイル(sample.txt)は、 2,jirou 5,gorou 4,shirou 1,tarou 6,mutsuo 3,saburou 下記の処理をします。 #include<stdio.h> #include<string.h> #define N 6 int sort1[N]; char sort2[N][30]; int BubbleSort(int data[N]) { int i,j,flag; do{ flag=0; for(i=0;i<N-1;i++) { if(data[i]>data[i+1]) { flag=1; j=data[i]; data[i]=data[i+1]; data[i+1]=j; } } } while(flag==1); return 0; } int main(void) { FILE *fpin; int id,h,k; printf("\n"); fpin=fopen("sample.txt","r"); if(fpin==NULL){ printf("ファイルをオープンできず!\n"); return 1; } for(k=0;k<N;k++) { h=fscanf(fpin,"%d,%s",&sort1[k],sort2[k]); if(h==EOF) break; printf("%d %s\n",sort1[k],sort2[k]); } printf("\n"); BubbleSort(sort1); for(k=0;k<N;k++) printf("%d %s\n",sort1[k],sort2[k]); return 0; } 実行結果は、 2 jirou 5 gorou 4 shirou 1 tarou 6 mutsuo 3 saburou 1 jirou 2 gorou 3 shirou 4 tarou 5 mutsuo 6 saburou 名前(sort2)もソートさせるには、どうすればいいか手ほどきをお願いします…

  • java(バブルソート/単純挿入ソート)

    以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }

  • javaのソートについて。

    うまく文章で伝えられないかもしれませんがお願いします。 csvファイルの中に 名前、住所、電話番号、アドレス と入った一文が複数あるとします。 これを名前の50音順に並べたいのですが、 文字でもArrays.sortでソートは可能でしょうか? 一応やってみたのですがうまくいきませんでした。 さらに質問なんですが私はこのcsvファイルの一文を削除したり、変更したりというプログラムを作っています。 変更や削除の場合は一度配列に全ての文を入れてその後削除、変更を行った後に またファイルに書き込むという形をとっています。 この場合50音順に並べるには一度書き込みが終った後もう一度読み込んでソートをして 書き込みなおすしか方法はないのでしょうか? ご教授お願いします。

    • ベストアンサー
    • Java
  • エクスプローラでの名前によるファイル名ソート方法

    例えば、 baseball1.txt football1.txt Baseball2.txt Football2.txt という4つのファイルを、エクスプローラで名前によるソートをかけた場合には、 baseball1.txt Baseball2.txt football1.txt Football2.txt …と表示されます。私は今までこのようなソートはアスキーコード順に次のようにソートされると思ってました。 Baseball2.txt Football2.txt baseball1.txt football1.txt このようなWindowsでの名前によるソートの基本的な方法を解説した良いweb site があれば教えてください。よろしくお願いします。

  • 多段ソート

    C言語というよりはアルゴリズムの話です。 [名前], [生年月日] の2つのカラムで表される固定長の行データが羅列されたファイルがあります。 また、各カラムを比較して行をソートした場合にどの行が何番目にくるかといったインデックス情報を木構造で保持したファイルがあります。 (このファイルは行データの追加・削除時に更新される) これらのファイルを利用して、生年月日でソートし、かつ日時が同じ場合は名前順にソートした場合の上から10個分だけのデータを取り出したいのですが、効率のよい方法は無いでしょうか? 全データを読み込んでから、バブルソート等の順序を崩さないソートを多重にかけることはなるべく避けたいのです。 そのためにソート済みのインデックス的な役割を持つファイルを用意しているのですが、多段ソート時にどう応用すればよいのかわからなくなってしまいました。 例 日時、名前の順にソートされた上4つ分のデータが欲しい。 【一覧】 [1行目] 10/20, Aさん [2行目] 11/30, Fさん [3行目] 9/10, Cさん [4行目] 11/30, Bさん [5行目] 12/10, Dさん 【生年月日でソートされた インデックス】 9/10, 3行目 10/20, 1行目 11/30, 2行目 11/30, 4行目 12/10, 5行目 【名前でソートされた インデックス】 Aさん, 1行目 Bさん, 4行目 Cさん, 3行目 Dさん, 5行目 Fさん, 2行目 得たい結果 [3行目] 9/10, Cさん [1行目] 10/20, Aさん [4行目] 11/30, Bさん [2行目] 11/30, Fさん

  • 構造体配列の安定なソート

    出席番号と得点の配列を持つ構造体配列で、 出席番号順に並んだ状態でqsortを使って得点をソートする場合、 同じ得点の人でも、出席番号順はばらばらになってしまいますよね。 調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、 qsortは標準ライブラリにあって、 比較関数も見よう見まねで作ってなんとかなったのですが、 他の方法となると具体的にどうすればいいのか、 よくわからない状況です。 http://homepage1.nifty.com/daccho/program/algo/sort3.htm こちらのサイトのソースファイルを見て、 普通のint配列のバブルソートは出来たのですが、 構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、 ここからどのように変更すればいいのでしょうか? 並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、 ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。 Cは勉強中で、基本文法がわかるぐらいという状況で、 もしかしたら変なことを言っているのかもしれませんが、 よろしくお願いします。

専門家に質問してみよう