読み込ませたファイルをクイックソートで並び替える

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,480

masaomi_ken

score 18

1.入力ファイルパスの入力要求

2.1でのパスのファイルを読み込み配列 
に格納

3.並び替え方法の指定

4.指定された方法の分岐

5.配列に格納されている数値を並び替える

6.出力先ファイルパスの入力要求を行う

7.5で並び替えたファイルの結果を6で指定したファイルに書き込む

バブルソートは出来たのですが、クイックソートの部分が上手く行きません。
ファイルを読み込んでint型の配列に移したiarrayがクイックソートの方で上手く
使えず変数 quick_sort に void は無効な型です。と出てしまいます。
また、if文の分岐はこれで合っているのでしょうか?

public class quick {

    public static void main(String[] args) throws IOException {

        String[] strarray = new String[10];
        int[] iarray = new int[10];

        int a=0;
        String kekka;
       try{   

                System.out.println("ファイルパスを入力してください。");

                BufferedReader br =
                        new BufferedReader(new InputStreamReader(System.in));

                String pass = br.readLine();

                File file = new File(pass);

                BufferedReader br2 = new BufferedReader(new FileReader(file));

                String str= null;
                a = 0;

                while((str = br2.readLine()) != null){
                    System.out.println(str); 

                    strarray[a]=str;
                    a = a +1;

                }

                br2.close();

                System.out.println("並び替え方法を入力してください。");            
                String c = br.readLine();

                //計測したい処理を記述
                long start = System.nanoTime();

                iarray = new int[10];

                for(int i = 0 ; i < strarray.length ; i++){
                    iarray[i] = Integer.parseInt(strarray[i]);
                }

                if(c.equals("baburu")){
                     for(int i=0; i < iarray.length-1; i++) {
                         for(int j=0; j < iarray.length-i-1; j++) {
                             if(iarray[j] > iarray[j+1]) {
                                 int asc = iarray[j];
                                 iarray[j] = iarray[j+1];
                                 iarray[j+1] = asc;
                             }
                         }
                     }

                } 
                    else if(c.equals("quick")){

                            // 配列dのleftからrightまでの間のデータ列をクイックソートする
                            static void quick_sort(int[] iarray, int left, int right) {
                                if (left>=right) {
                                    return;
                                }
                                int p = iarray[(left+right)/2];
                                int l = left, r = right, tmp;
                                while(l<=r) {
                                    while(iarray[l] < p) { l++; }
                                    while(iarray[r] > p) { r--; }
                                    if (l<=r) {
                                        tmp = iarray[l]; iarray[l] = iarray[r]; iarray[r] = tmp;
                                        l++; r--;
                                    }
                                }
                                quick_sort(iarray, left, r);  // ピボットより左側をクイックソート
                                quick_sort(iarray, l, right); // ピボットより右側をクイックソート
                            }
                            // 配列内のデータ列を表示する
                            static void print_data(int[] iarray) {
                                for(int i = 0; i < iarray.length; i++) System.out.print(iarray[i] + " ");
                                System.out.println();
                            }
                          }

                      /*  public static void main(String[] args) {
                            int[] data = {5, 10, 3, 7, 8, 1, 9, 2};
                            print_data(data);
                            quick_sort(data, 0, data.length-1);
                            print_data(data);
                        }

                      }

                 /* ソートでかかった時間を計測 */
                long end = System.nanoTime();
                System.out.println("Time:" + (end - start) / 1000000f + "ms");

                System.out.println("出力するファイルを入力してください。");
                String tmp1 = br.readLine();

                // Fileクラスをインスタンス化
                File file1 = new File( tmp1 );

                // ファイルが存在するかどうかを判定
                if ( !file1.exists() ) {
                    // ファイルが存在しない場合は処理終了
                    System.out.println( "ファイルが存在しない" );
                    return;
                }

                // 指定されたパスがファイルかどうかを判定
                if ( !file1.isFile() ) {
                    // ディレクトリを指定した場合は処理終了
                    System.out.println( "ファイル以外を指定" );
                    return;
                }

                // ファイルが書き込み可能かどうかを判定
                if ( !file1.canWrite() ) {
                    // ファイルが読み込み不可の場合は処理終了
                    System.out.println("ファイルが読み込み不可");
                    return;
                }        

             // FileWriterクラスをインスタンス化
                FileWriter filewriter = new FileWriter(file1);

                for(int i = 0; i < iarray.length; i++) {
                    filewriter.write(iarray[i]+"¥r¥n");
                }

                System.out.println("指定ファイルに書き込まれました。");
                // ファイルを閉じる
                filewriter.close();  

                }catch(IOException e){
                        System.out.println(e);
                }

        }

    }

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

まずはきちんと、メソッドを分けましょう。
そうすれば、if文まわりも

if(c.equals("baburu")){ 
    bubble_sort(iarray);
}  
else if(c.equals("quick")){
    quick_sort(iarray, 0, iarray.length - 1);
}
// 配列内のデータ列を表示する 
display_result(iarray);

このような感じになって、見通しが良くなります。

頑張って下さい。

Javaの基礎を理解されていないようですね。
取り敢えず、スケルトン(骨組み)を示すとこんな感じになります。

/**
 * クイックソート
 */
public class QuickSortTest
{
    public static void main(String[] args)
    {
        // ソート用の整数配列
        int[] iarray = new int[10];
            ・
            ファイルから読むなどの前準備
            ・
        if(c.equals("baburu")) {
            // バブルソート実行
            bubbleSort(iarray);
        }   
        else if(c.equals("quick")){ 
            // クイックソート実行
            quickSort(iarray, 0, iarray.length-1);
        } 
        //結果表示
        displayResult(iarray);
    }

    /**
     * バブルソートを行うメソッド
     * @param array ソート対象配列
     */
    public static void bubbleSort(int[] array)
    {
        ・
    バブルソートの処理
        ・
    }

    /**
     * クイックソートを行うメソッド
     * @param array ソート対象配列
     * @param leftIndex 左開始点
     * @param rightIndex 右開始点
     */
    public static void quickSort(int[] array, int leftIndex, int rightIndex)
    {
        ・
    クイックソートの処理
        ・
    }

    /**
     * 結果を出力
     * @param array 配列
     */
    public static void displayResult(int[] array)
    {
        for(int i : array)
        {
            System.out.println(String.valueOf(i) + " ");
        }
        System.out.println("");
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/31 10:35

    メソッドを分けるという意味が理解出来ません。実際の処理はif文の外で行い結果だけ持ってくるということでしょうか⁇

    キャンセル

  • 2016/01/31 17:12

    Javaの基本を理解されて居ないようなので、スケルトンコードを追記しました。

    キャンセル

checkベストアンサー

0

今現在、mainメソッドの内部にquick_sortメソッドの宣言が入っている形になっています。
メソッドの中でメソッドの宣言はできないためエラーになっています。
コンパイラとしてはメソッドの内部でvoidというキーワードを使うことができないため、エラーを出しています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/31 10:43

    その場合、クイックソートの処理はvoid mainの外で行わないといけないのでしょうか⁇

    キャンセル

  • 2016/01/31 10:45

    そうなります。

    キャンセル

  • 2016/01/31 16:11

    クイックソートの処理だけを外でやって並び替えたものだけを持ってくる流れは分かりましたがどう書いたらいいのか分かりません

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る