0

車両のメーカーとモデルで情報を並べ替える必要があるデータ ファイルがあります。バブルソートが機能しません。問題を解決するのを手伝ってくれませんか? どうもありがとうございました!PS追加のメソッドを持つことはできません:( getMake() メソッドを削除すると機能しますが、 && getModel はまったく機能しません:(

    public static void sortByVehicleMakeModel(Vehicle[] vehicles) {
        for(int y = 0; y < vehicles.length; y++) {
            for (int x = 0 ; x < vehicles.length - 1 ; x++){
                if((vehicles[x].getMake().compareToIgnoreCase(vehicles[x+1].getMake()) > 0) && (vehicles[x].getModel().compareToIgnoreCase(vehicles[x+1].getModel()) > 0)) {    
                    swap(vehicles, x, x + 1);
                }           
            }
        }
        for(int x = 0; x < vehicles.length - 1; x++){
            System.out.println(vehicles[x].getMake());
        }
    }
4

3 に答える 3

5

2 つの車両を比較するには、次の手順に従います。

  • 2つの車のメーカーを比較する
  • 等しくない場合は、比較の結果を返します
  • それらが等しい場合、モデルを比較して結果を返します

if ステートメントのコードを、上記のロジックを使用して 2 つの車両を比較するメソッドに置き換える必要があります。

このようなもの:

if (compareVehicles(vehicles[x], vehicles[x + 1]) > 0) {
    swap(vehicles, x, x + 1);
}

これを正しく行うには、VehicleにComparableを実装させる必要があります。

そうすれば、上記のロジックをcompareToメソッドに入れることができます。

これにより、これを簡単に実行できます。

if (vehicles[x].compareTo(vehicles[x + 1]) > 0) {
    swap(vehicles, x, x + 1);
}

Comparable を実装する方法の簡単な例を次に示します。

class Vehicle implements Comparable<Vehicle> {
    private String make;
    private String model;

    public int compareTo(Vehicle other) {
        if (other == null) {
            return -1;
        }
        int compareVal = make.compareToIgnoreCase(other.make);
        if (compareVal == 0) {
            return model.compareToIgnoreCase(other.model);
        }
        else {
            return compareVal;
        }
    }

}

わかりました...数日経ったので、その方法をお見せします。

public static void sortVehicles(Vehicle[] vehicles) {
    for (int i = 0; i < vehicles.length - 1; i++) {
        Vehicle curr = vehicles[i];
        Vehicle next = vehicles[i + 1];
        String currMake = curr.getMake();
        String nextMake = next.getMake();
        int compareVal = currMake.compareToIgnoreCase(nextMake);
        // if the makes are the same, we need to compare the models
        if (compareVal == 0) {
            String currModel = curr.getModel();
            String nextModel = next.getModel();
            compareVal = currModel.compareToIgnoreCase(nextModel);
        }
        if (compareVal > 0) {
            swap(vehicles, i, i + 1);
        }
    }

    for (Vehicle v : vehicles) {
        System.out.println(v.getMake());
    }
}
于 2012-11-27T02:41:22.260 に答える
2

パフォーマンスを向上させるためだけに(比較ロジックについては、@jahroyが正しいことを理解しています)。あなたの場合、2番目のループのコードは次のようになるはずです: x < vehicle.length - y -1

    for(int y = 0; y < vehicles.length; y++) {
        for (int x = 0 ; x < vehicles.length - y -1 ; x++){
            if((vehicles[x].getMake().compareToIgnoreCase(vehicles[x+1].getMake()) > 0) && (vehicles[x].getModel().compareToIgnoreCase(vehicles[x+1].getModel()) > 0)) {    
                swap(vehicles, x, x + 1);
            }           
        }
    }
于 2012-11-27T02:43:50.527 に答える
0

これが私がそれを修正した方法です:

public static void sortByVehicleMakeModel(Vehicle[] vehicles) {


    for(int y = 0; y < vehicles.length; y++) {
        for (int x = 0 ; x < vehicles.length - 1 ; x++){
            boolean compare1 = (vehicles[x].getMake().compareToIgnoreCase(vehicles[x+1].getMake()) > 0);

        if (compare1){
            swap(vehicles, x, x + 1);

        }       

    }           
}
于 2012-11-28T20:53:03.223 に答える