2010-11-30 3 views
0

を逆にする必要があり、それは私はそれがで並べ替えしたいものよりも、逆にソートされ除く。Java配列の逆順ソート!今、私は私の配列(エラーを取得してより優れている)並べ替えを持って逆

public static void sortDatabase(int numRecords, String[] sDeptArr, 
       int[] iCourseNumArr, int[] iEnrollmentArr) 
    { 
     System.out.println("\nSort the database. \n"); 
     String sTemp = null; 
     int iTemp = 0; 
     int eTemp = 0; 
     String a, b = null; 
     for(int i=0; i<numRecords; i++) 
     { 
      int iPosMin = i+1; 
      for(int j=iPosMin; j<numRecords; j++) 
      { 
       a = sDeptArr[i]; 
       b = sDeptArr[iPosMin]; 
       if(a.compareTo(b) > 0) 
       { 
        sTemp= sDeptArr[j]; 
        sDeptArr[j] = sDeptArr[iPosMin]; 
        sDeptArr[iPosMin] = sTemp; 
        iTemp = iCourseNumArr[j]; 
        iCourseNumArr[j] = iCourseNumArr[iPosMin]; 
        iCourseNumArr[iPosMin] = iTemp; 
        eTemp = iEnrollmentArr[j]; 
        iEnrollmentArr[j] = iEnrollmentArr[iPosMin]; 
        iEnrollmentArr[iPosMin] = eTemp; 
       } 
       else if(sDeptArr[j].equals(sDeptArr[iPosMin]) && !(iCourseNumArr[j] < iCourseNumArr[iPosMin])) 
       { 
        sTemp= sDeptArr[i]; 
        sDeptArr[i] = sDeptArr[iPosMin]; 
        sDeptArr[iPosMin] = sTemp; 
        iTemp = iCourseNumArr[i]; 
        iCourseNumArr[i] = iCourseNumArr[iPosMin]; 
        iCourseNumArr[iPosMin] = iTemp; 
        eTemp = iEnrollmentArr[i]; 
        iEnrollmentArr[i] = iEnrollmentArr[iPosMin]; 
        iEnrollmentArr[iPosMin] = eTemp; 
       } 
       else continue; 
      } 

     } 
    } 
再び

、ノー配列をリストまたは配列ソート私はこれをどのように並べ替える必要があるが、私はどのように考えていない。

答えて

3

は、だけではなく、> 0

EDITa.compareTo(b) < 0の操作を行います。私はこの問題を考え出しました。あなたが選択ソートを行っている

  • :これは宿題(正直に感謝)があるので、しかし、私はここに私の解決策を投稿しませんが、いくつかのヒントがあります。アルゴリズムはあなたが作ったほど複雑ではありません。あなたがチェックしている2つの要素の順序が間違っていれば、スワップする必要があります。私はあなたが3つの支店を持っていることを見て、必要はありません。

  • abを割り当てるときを見てください。 jが変更されている内部ループを通して、iiPosMinが同じままであるので、abは決して変更されません。私はそれが助けて欲しい

  • 方法を抽出することでわかっている慎重な部分にアルゴリズムを分解することは、常に良いことです。同じスワップコードを2回繰り返しますが、インデックスの引数は異なります。それを取り出し、ちょうどます

-

// swaps the object at position i with position j in all arrays 
private static void swap(String[] sDeptArr, int[] iCourseNumArr, int[] iEnrollmentArr, int i, int j) 

その後、あなたはたくさんのクリーナーを取得するコードです表示されます。

+0

試しても動作しません。 – Mike

+0

その場合、あなたのアルゴリズムはまったくソートされていないとしか言​​えません。それが正しくソートされ、常に逆転されていれば、私の解決策が動作します。私はちょうどあなたのプログラムを逐語的に実行しました、そして、それは並べ替えません。 – shoebox639

1

ええと...あなたは何が起こるのだろうと、if(a.compareTo(b) > 0)という行を変更したのでしょうか?

+0

動作しません。部分的に正しい出力を出力します。 – Mike

+0

何を変更しましたか?あなたはそれを変更することができる他のものはありますか?間違って並べ替えられた項目はヒントを与えますか?コード内の何かを変更して、逆順でソートすることはできますか? –

+0

私はそれを<に変更し、私がそれを変更するたびに異なって並べ替えます – Mike

2

まず、プログラムの情報をカプセル化するためにデータ構造を構築する必要があると思います。だからコースと呼んでみましょう。

public class Course { 
    public String department; 
    public Integer courseNumber; 
    public Integer enrollment; 
} 

なぜJavaの組み込みソート機能を使用しないのですか?

List<Course> someArray = new ArrayList<Course>(); 
... 
Collections.sort(someArray, new Comparator<Course>() { 
    public int compare(Course c1, Course c2) { 
     int r = c1.compareTo(c2); 
     if(r == 0) { /* the strings are the same sort by something else */ 
      /* using Integer instead of int allows us 
      * to compare the two numbers as objects since Integer implement Comparable 
      */ 
      r = c1.courseNumber.compareTo(c2.courseNumber); 
     } 
     return r; 
    } 
}); 

あなたの宿題にAが表示されます。ああ、静的なJrを捨てるかもしれない。ある日、あなたの専門家は静的な形をしていない理由を調べることができるかもしれない。

+0

いいえ、遠ざかります!私はここにそのようなものは必要ありません。私はそれが私が行く方法、配列リストやものを行う必要があります。 JKが真剣に私はそれを使用することはできません。 – Mike

+0

さて、私はあなたにヒントを与えます。内側のループの終わりに達するまで配列をシャッフルしないでください。だからあなたの比較に応じて最小の整数を追跡してください。その後、内側のループがそのパスで最小のものを見つけた後。それをiのオブジェクトと入れ替えます。これは、並列配列の代わりにCourseオブジェクトを使用すれば、はるかに簡単です。あなたはaとbを比較していますが、aはインデックスiから来ています。それからあなたのシャッフルで、あなたはjを使っています。見えない – chubbsondubs

+0

@Chadしかし、オブジェクトは正しく使用できますか?アルゴリズムでソートすることはできますが、3つの配列を扱うことはできません。あなたのコードをたくさんクリーンアップします。単純なリファクタリング(行動を保存するコードの変更)によって多くの時間ばかげたバグが公開されています – shoebox639

関連する問題