将对象添加到按字母顺序排列的数组中

时间:2012-10-23 00:42:27

标签: java

此代码要求用户输入具有名称,型号年份,上市价格和折扣百分比的车辆对象。这里出现的问题是,当用户输入以上所有信息时,汽车对象被添加到数组列表的底部而不是按字母顺序。请注意,该列表之前已按字母顺序排列。

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 个答案:

答案 0 :(得分:2)

变量found在初始化后永远不会更改,因此while循环始终会转到列表的末尾。

答案 1 :(得分:1)

虽然稍微偏离主题,但您可以使用Collections.binarySearch来确定应插入新值的位置...

来自Java Docs

  

返回:       搜索关键字的索引,如果它包含在列表中;否则,( - (插入点) - 1)。 插入点定义为   密钥将插入列表的位置:索引   第一个元素大于键,或list.size()如果全部   列表中的元素小于指定的键。请注意这一点   当且仅当密钥时,保证返回值>&gt; = 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);

这假定Proj1CarDataComparable,否则您将需要提供自己的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);
}

答案 2 :(得分:0)

我无法清楚地了解你的问题。我猜你得到“字母顺序”的算法存在一些逻辑上的错误。

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

        }

在此循环之后,loc的值将由carList.size添加,因​​为if()中的条件始终为true。这意味着您将始终将newCar添加到arrayList的末尾,但不是按照您想要的正确顺序。

实现Comparator接口可能有所帮助。

答案 3 :(得分:0)

搞定了。我用对象遍历了数组列表。从键盘输入的名称在“if”语句中用作compareToIgnoreCase()方法的条件。它将该对象添加到按字母顺序排列的数组列表的正确位置。

     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