質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2828閲覧

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

masaomi_ken

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/01/29 08:45

編集2016/01/29 08:47

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); } } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まずはきちんと、メソッドを分けましょう。
そうすれば、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/29 10:50

編集2016/01/31 08:11
tsuntsun

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaomi_ken

2016/01/31 01:35

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

2016/01/31 08:12

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

0

ベストアンサー

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

投稿2016/01/31 01:38

編集2016/01/31 01:40
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaomi_ken

2016/01/31 01:43

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

2016/01/31 01:45

そうなります。
masaomi_ken

2016/01/31 07:11

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問