2

どうも、1 次元配列の単純なバブル ソートを実装する方法を知っています。しかし、2 次元または多次元の場合、そこに問題があります。

これまでのところ、これを使用して1次元配列をソートしてきましたが、魅力的です。ただし、ほとんどの場合、文字列ではなく整数を使用します。

boolean sort;

do{
    sort = true;

    for (int i = 0; i < testarray.length - 1; i++){
        if(testarray[i] > testarray[i+1]){
            temp = testarray[i];
            testarray[i] = testarray[i+1];
            testarray[i+1] = temp;           
            sort = false;
        }
    }

}while(!sort);

    // Descending Output
    // for (int k = testarray.length - 1; k >= 0 ; k--){

    // Ascending Output
    for (int k = 0; k < testarray.length ; k++){
        System.out.print(testarray[k] + ", ");
    }

私が持っていると仮定します:

顧客番号、名前、姓、住所

String customers[][] = {{"123", "John", "Doe", "Somewhere"}, {"007", "James", "Bond", "MI5"}, {"1337", "Lolcat", "Izgud", "Saturn"}}

ここで、次の順序でソートすることを選択したいと思います: 顧客番号、名前、姓、または住所。その後、必要に応じて昇順または降順で出力したいと思います。

これをバブルソートで実装する方法がわかりません。私はバブルソートにとどまりたいです, , 他のソートアルゴリズムはありません, 私はそのような状況でバブルソートがどのように機能するかを学びたいです.

昇順と降順については、次のようになります。if ループを実行できます。たとえばif (asc == 1) then output ascending, else output descending。asc は、たとえばコンソール経由で尋ねられます。

どんな助けでも大歓迎です。

4

4 に答える 4

3

2D 配列では、含まれるオブジェクトの型が変更されます(int注意: これは文字列の配列です)。これは、タイプをに変更する必要があるものです。IntegerString[]temp

最大の変化はあなたの比較になります。を使用して 2 つの String 配列を比較することはできません<が、これは既にご存じでしょう。あなたがする必要があるのは、2 つの引数を取りString[]、最初の引数が 2 番目の引数より小さい/等しい/大きいかどうかに応じて、負、0、または正の数を返すメソッドを自分で作成することです。次に、そのメソッドの結果に対して</>比較を実行して、並べ替え順序を確立できます。

いくつかの異なる並べ替え基準を使用できるようにしたい場合は、(たとえば) 別のパラメーターを渡して動作方法を伝えることにより、比較関数をより用途の広いものにするか、いくつかの異なる比較関数が必要になります。 or を使用して、ソート中にどちらを使用するifswitchを決定します。

2 つの String 配列を手動で比較する場合の基本的な方法は次のとおりです。 を使用して最初のキー文字列を比較しますString.compareTo()。結果が 0 でない場合は、それを返します。0 の場合、最初のキーは等しいので、次のキーを比較する必要があります。キーが不足してもまだ 0 の場合、2 つの要素のキーは同じであり、0 を返します。

于 2009-12-06T14:37:44.053 に答える
3

2 次元配列は、基本的に配列で構成される 1 次元配列です。

int の代わりに、内部配列を移動するだけで、同じコードを使用してください。

ある配列が次の配列よりも「大きい」かどうかを知るには、正しい配列メンバーの文字列値を比較します (つまり、名前や姓など)。これを行うには、String CompareTo メソッドを使用できます。

最後の注意:内部配列が実際に情報を含むオブジェクトである場合、あなたが示した例はより良いものです。このようにして、すべてのフィールドを文字列にするのではなく、すべてのフィールドに個別のデータ型を設定できます。

例えば:

  class Person
  {
       int customerNumber;
       String name;
       String surName;
       String address;
  };

編集:実際にあなたの質問に答えるには:

プログラムを次のように変更します。

一時宣言を変更します。

 String [] temp;

行を変更します。

 if(testarray[i] > testarray[i+1])

の中へ:

 if(testarray[i][1] > testarray[i+1][1])

それが機能し、名前でソートするよりも

R

于 2009-12-06T14:35:17.663 に答える
2

「123」、「john」、「doe」、「somewhere」をグループ化する必要があると思います。

オブジェクトを使用することをお勧めします。

public object Person {
    private int id;
    private String name;
    private String surname;
    private String address;
}

通常のゲッターとセッターを追加します。

通常の Person オブジェクトの配列を、バブル ソート アルゴリズムでソートすることができます。ID、名前、姓、または住所のいずれかをバブル ソート アルゴリズムと比較するカスタム コンパレータをいくつか作成できます。

sort メソッドのシグネチャは次のようになります。

public Person[] bubbleSort(Person[] persons, Comparator comp)
于 2009-12-06T14:38:23.320 に答える
2

同じソートアルゴリズムを維持できます。2D 配列はまだ認識されません。2 つの 1D 配列を取り、どちらが大きいかを示す比較関数を考え出す必要があります。

于 2009-12-06T14:34:29.397 に答える