実現したいこと
SortMainにQuicSortを結合してコマンド引数で切り替えれるようにしたいです。
前提
自分なりにSortMainに書いてみましたが下記の様なエラーが起きました。
どのように変更すれば良いのかを教えていただきたいです。
発生している問題・エラーメッセージ
SortMain.java:220: エラー: ';'がありません int[] sort(int[] d) { ^ SortMain.java:220: エラー: ';'がありません int[] sort(int[] d) { ^ エラー2個
###SortMain###
import java.util.Stack; public class SortMain { public static void main(String args[]) { int data[] = {25, 47, 93, 62, 8, 71, 12, 28, 34, 55}; System.out.print("元のデータ"); print_data(data); if (args.length >= 1) { switch (args[0]) { case "BubbleSort": BubbleSort(data); break; case "InsertSort": InsertSort(data); break; case"SelectSort": SelectSort(data); break; case"MergeSort": MergeSort(data); break; case"bubblesort": bubblesort(data); break; case"insertsort": insertsort(data); break; case"selectsort": selectsort(data); break; case"mergesort": mergesort(data); break; default: break; } System.out.print("並び替えたデータ:"); print_data(data); } } static void print_data(int a[]) { System.out.print('['); for (int i = 0; i < a.length; i++) { System.out.print(a[i]); if (i < a.length - 1) System.out.print(','); } System.out.println(']'); } static void BubbleSort(int a[]) { for (int i = 0; i < a.length; i++) { for (int j = a.length - 1; j > i; j--) { if (a[j - 1] > a[j]) { int tmp = a[j - 1]; a[j - 1] = a[j]; a[j] = tmp; } System.out.print(i+"回目"); print_data(a); } } } static void InsertSort(int a[]) { for (int i = 1; i < a.length; i++) { int target = a[i]; int j; for (j = i - 1; j >= 0; j--) { if (a[j] < target) { a[j + 1] = target; break; } else a[j + 1] = a[j]; } if (j < 0) a[0] = target; System.out.print(i+"回目"); print_data(a); } } static int searchMin(int a[],int start) { int mpos = start; / for(int i = start+1; i < a.length; i++) if(a[mpos] > a[i]) mpos = i; return mpos; } static void SelectSort(int a[]) { for(int i = 0; i < a.length; i++) { int mpos = searchMin(a,i); int tmp = a[i]; a[i] = a[mpos]; a[mpos] = tmp; System.out.print(i+"回目"); print_data(a); } } static void MergeSort(int a[]) { if(a.length <= 1) return; int blen,clen; blen = clen =a.length/2; if(a.length % 2 != 0) blen++; int b[] = new int[blen]; int c[] = new int[clen]; for(int i = 0; i < a.length; i++) { if(i<blen) b[i] = a[i]; else c[i-blen] = a[i]; } System.out.print("2つに分割"); print_data("sorting ", a, true); MergeSort(b); MergeSort(c); for(int i = 0,bi = 0,ci = 0; i < a.length; i++) { if(bi < blen && ci < clen) { if(b[bi]<=c[ci]) a[i] = b[bi++]; else a[i] = c[ci++]; } else if(ci >= clen) a[i] = b[bi++]; else a[i] = c[ci++]; } } static void print_data(String s,int a[],boolean flag) { System.out.print(s); print_data(a,flag); } static void print_data(int a[],boolean flag) { System.out.print("["); for(int i = 0; i < a.length; i++) { System.out.print(a[i]); if(i < a.length-1) System.out.print(","); } if(flag) System.out.println("]"); else System.out.println("]"); } static void bubblesort(int a[]) { for(int i = 0; i < a.length; i++) for(int j = a.length-1; j > i; j--) { if(a[j-1] < a[j]) { int tmp = a[j-1]; a[j-1] = a[j]; a[j] = tmp; } System.out.print(i+"回目"); print_data(a); } } static void insertsort(int a[]) { for(int i = 1; i < a.length; i++) { int target = a[i]; int j; for(j = i-1; j >= 0; j--) { if(a[j] > target) { a[j+1] = target; break; } else a[j+1] = a[j]; } if(j<0) a[0] = target; System.out.print(i+"回目"); print_data(a); } } static int Min(int a[],int start) { int mpos = start; for(int i = start+1; i < a.length; i++) if(a[mpos] < a[i]) mpos = i; return mpos; } static void selectsort(int a[]) { for(int i = 0; i < a.length; i++) { int mpos = Min(a,i); int tmp = a[i]; a[i] = a[mpos]; a[mpos] = tmp; System.out.print(i+"回目"); print_data(a); } } static void mergesort(int a[]) { if(a.length <= 1) return; int blen,clen; blen = clen =a.length/2; if(a.length % 2 != 0) blen++; int b[] = new int[blen]; int c[] = new int[clen]; for(int i = 0; i < a.length; i++) { if(i<blen) b[i] = a[i]; else c[i-blen] = a[i]; } System.out.print("2つに分割"); print_data("sorting ", a, true); mergesort(b); mergesort(c); for(int i = 0,bi = 0,ci = 0; i < a.length; i++) { if(bi > blen && ci > clen) { if(b[bi]<=c[ci]) a[i] = b[bi++]; else a[i] = c[ci++]; } else if(ci >= clen) a[i] = b[bi++]; else a[i] = c[ci++]; } } }
###QuicSort###
public class QuicSort { static int[] sort(int[] d) { if(d == null) return null; if(d.length<=1) return d; int pivot = d[0]; MStack a = new MStack(d.length); MStack b = new MStack(d.length); for(int i = 1; i<d.length;i++) { if(d[i]<pivot) a.push(d[i]); else b.push(d[i]); System.out.print(i+"回目"); print_data(d); } MStack ans = new MStack(d.length); ans.push(sort(a.toArray())); ans.push(pivot); ans.push(sort(b.toArray())); return ans.toArray(); } static void print_data(String s,int a[],boolean flag) { System.out.print(s); print_data(a,flag); } static void print_data(int a[],boolean flag) { System.out.print('['); for(int i = 0;i < a.length;i++){ System.out.print(a[i]); if(i < a.length-1) System.out.print(','); } if(flag) System.out.println(']'); else System.out.print(']'); } static void print_data(int a[]) { print_data(a, true); } public static void main(String[] arg) { int data[] = {11,61,31,13,65,64,56,12,25,27,37,93}; System.out.print("元のデータ"); print_data(data); print_data(data); int[] ans = sort(data); print_data(ans); } } class MStack { int[] data; int nItem; MStack(int n) { data = new int[n]; nItem = 0; } void push(int x) { data[nItem] = x; nItem++; } void push(int[] d) { if(d == null) return; for(int i=0;i < d.length;i++) push(d[i]); } int pop() { nItem--; return data[nItem]; } int[] toArray() { if(nItem <= 0) return null; int[] ans = new int[nItem]; for(int i = 0; i < nItem; i++) ans[i] = data[i]; return ans; } }
//ここまでは上のSortMainと同じです static void QuicSort(int a[]){ int[] sort(int[] d) { if(d == null) return null; if(d.length<=1) return d; int pivot = d[0]; MStack a = new MStack(d.length); MStack b = new MStack(d.length); for(int i = 1; i<d.length;i++) { if(d[i]<pivot) a.push(d[i]); else b.push(d[i]); System.out.print(i+"回目"); print_data(d); } MStack ans = new MStack(d.length); ans.push(sort(a.toArray())); ans.push(pivot); ans.push(sort(b.toArray())); return ans.toArray(); } if(flag) System.out.println(']'); else System.out.print(']'); } class MStack { int[] data; int nItem; ) MStack(int n) { data = new int[n]; nItem = 0; } void push(int x) { data[nItem] = x; nItem++; } void push(int[] d) { if(d == null) return; for(int i=0;i < d.length;i++) push(d[i]); } int pop() { nItem--; return data[nItem]; } int[] toArray() { if(nItem <= 0) return null; int[] ans = new int[nItem]; for(int i = 0; i < nItem; i++) ans[i] = data[i]; return ans; } } }
SortMain.java の 220 行目というのはどこでしょうか。
それと、コードの {} の付け方やインデントはしっかり合わせるようにしてください。
コーディングに慣れないうちは {} が省略できる場合でも省略しないほうが良いです。
時にはそれだけで問題が浮き彫りになったり直ったりします。
もしご自身の画面ではインデントは正しいのに teratail に貼ると変になるのであれば、インデントがタブとスペースが混在していないか確認してどちらかに統一してください。
3つ目のコードの最初の「static void QuicSort(int a[]){」の下の行からです。
3つ目のコードは、何でしょう。 SortMain.java 内のコードなら、なぜ1つ目に入っていないのでしょうか。
SortMainとは別に自分が書いてみたものが3つ目のコードでエラーは3つ目のプログラムを実行したときに起きたエラーです。
元のSortMainがあった方がよいかと思いQuicSortを結合してみる前のSortMainも載せた結果SortMainが2つ載せられている状態になってしまいました。
まず必要なのはエラーが発生した状態のコードですので、そのコードの方で省略するくらいなら修正は(ひとまずは)必要ありません。
コード的には
>static void QuicSort(int a[]){
>int[] sort(int[] d) {
というのは java の構造から逸脱しています。
QuicSort クラス(QuickSort?)の宣言文をむりやりメソッド風にしたところで都合よく動作したりはしません。
メソッド内にメソッドがあるような形になっていますので、 java の構造に沿うように修正して頂くしかありません。
どのように修正するのかは、他人には判断出来ません。
ついでに、コード上にコピペ時に何か書いて仕舞われたのかゴミがあってコンパイルエラーになります。
せめて解決してから退会して欲しい