2

このコードは、名前、モデル年、リスト価格、および割引率を含む車両オブジェクトを入力するようにユーザーに要求します。ここで発生している問題は、ユーザーが上記のすべての情報を入力すると、車のオブジェクトがアルファベット順ではなく配列リストの一番下に追加されることです。リストは以前にアルファベット順になっていることに注意してください。

while (!valid) {
    String str = scan.nextLine();
    try {
        boolean found = false;
        System.out.println("Enter car name: ");
        name = scan.nextLine();
        System.out.println("Enter car model year: ");
        modelYear = scan.nextLine();
        System.out.println("Enter car list price: ");
        listPrice = scan.nextDouble();
        System.out.println("Enter car percent discount: ");
        percentDiscount = scan.nextDouble();

        int i = 0;
        loc = 0;
        while (!found && i < carList.size()) {
            String nameRetrievedFromCarList = carList.get(i).getName();
            String nameToAdd = "";
            if (nameToAdd.compareToIgnoreCase(nameRetrievedFromCarList) < 0) {
                loc++;
                found = true;

            }
            i++;

        }// end while

        Proj1CarData newCar = new Proj1CarData(name, modelYear, listPrice, percentDiscount,
                discountAmount, netPrice);
        carList.add(loc, newCar);

        valid = true;

    }// end try

    catch (NumberFormatException nfe) {
        System.out.println("Wrong entry:  Try again");
    }// end catch

}
4

4 に答える 4

3

Collections.binarySearch少し話題から外れていますが、新しい値を挿入する場所を決定するために使用できます...

Java ドキュメントから

戻り値: リストに含まれている場合は検索キーのインデックス。それ以外の場合は (-(挿入ポイント) - 1)。挿入ポイントは、キーがリストに挿入されるポイントとして定義されます。キーより大きい最初の要素のインデックス、またはリスト内のすべての要素が指定されたキーより小さい場合は list.size() です。これにより、キーが見つかった場合にのみ、戻り値が >= 0 になることが保証されることに注意してください。

Proj1CarData newCar = new Proj1CarData(name, modelYear, listPrice, percentDiscount, discountAmount, netPrice);

int index = Collections.binarySearch(carList, newCar);
if (index < 0) {
    index = (index * -1) - 1;
}

carList.add(index, newCar);

Proj1CarDataこれはComparable、それ以外の場合は、独自のものを提供する必要があることを前提としていますComparator

Proj1CarData newCar = new Proj1CarData(name, modelYear, listPrice, percentDiscount, discountAmount, netPrice);

int index = Collections.binarySearch(carList, newCar, 
    new Comparator<Proj1CarData>() {
        public int compare(Proj1CarData car1, Proj1CarData car2) {
            return car1.getName().compareToIgnoreCase(car2.getName());
        }
    });

if (index < 0) {
    index = (index * -1) - 1;
}

carList.add(index, newCar);

更新しました

List<String> names = new ArrayList<String>(25);
names.add("Hurzdiirn");
names.add("Alydriira Talabdiira");
names.add("Urlidil Sineth");
names.add("Quavyraen Belarral");
names.add("Belarayne'bryn Agh'Quarbryn");
names.add("Alakgos");
names.add("Sszoj'hrae Laelraema");
names.add("Szornet");
names.add("Filojafay");
names.add("Lltril'net Chaszhrae");

Collections.sort(names);

for (int index = 0; index < names.size(); index++) {
    String name = names.get(index);
    System.out.println("[" + index + "] " + name);
}

int insertAt = Collections.binarySearch(names, "Luke");
if (insertAt < 0) {
    insertAt = (insertAt * -1) - 1;
}

names.add(insertAt, "Luke");

for (int index = 0; index < names.size(); index++) {
    String name = names.get(index);
    System.out.println("[" + index + "] " + name);
}

Collections.sort(names);
for (int index = 0; index < names.size(); index++) {
    String name = names.get(index);
    System.out.println("[" + index + "] " + name);
}
于 2012-10-23T01:02:28.780 に答える
2

変数foundは初期化後に変更されることはないため、whileループは常にリストの最後に進みます。

于 2012-10-23T00:45:42.400 に答える
0

動作しました。配列リストをオブジェクトでトラバースしました。キーボードから入力された名前は、compareToIgnoreCase() メソッドの条件として "if" ステートメント内で使用されました。アルファベット順の配列リストの適切な場所にそのオブジェクトを追加します。

     while(!valid)
      {
       try
          {

           System.out.println("Enter car name: ");
           name = scan.nextLine();
           System.out.println("Enter car model year: ");
           modelYear = scan.nextLine();
           System.out.println("Enter car list price: ");
           listPrice = scan.nextDouble();
           System.out.println("Enter car percent discount: ");
           percentDiscount = scan.nextDouble();

           for (int i = 0; i < carList.size(); i++) {
              String nameRetrievedFromCarList = carList.get(i).getName( );

              if (name.compareToIgnoreCase(nameRetrievedFromCarList) < 0) {
                 break;
              }
              loc++;
           }

           discountAmount = listPrice * percentDiscount/100.0;
           netPrice = listPrice - discountAmount;

           Proj1CarData newCar = new Proj1CarData(name, modelYear, listPrice, percentDiscount, discountAmount, netPrice);

           carList.add(loc, newCar);

           valid = true;




        }//end try


           catch(NumberFormatException nfe)
           {
              System.out.println("Wrong entry: it is not an Integer! Try again");
           }//end catch

     }//end while
于 2012-10-23T20:24:54.280 に答える
0

私はあなたの質問をはっきりと聞き取ることができません。「アルファベット順」を取得するアルゴリズムには論理的な誤りがあると思います。

while (!found && i < carList.size()) {
            String nameRetrievedFromCarList = carList.get(i).getName();
            String nameToAdd = "";
            if (nameToAdd.compareToIgnoreCase(nameRetrievedFromCarList) < 0) {
                loc++;
            }
            i++;

        }

このループの後、if() の条件が常に true であるため、carList.size によって loc の値が追加されます。つまり、常に newCar を arrayList の最後に追加しますが、必要な正しい順序ではありません。

Comparator インターフェイスを実装すると役立つ場合があります。

于 2012-10-23T02:17:53.707 に答える