我有一个CarLot类,一个Car类和一个CarLotApp类来为它设置GUI。 CarLot是Car对象的ArrayList。我在CarLot中有方法选择基于Car(make,model,mpg等)中的实例变量对CarLot进行排序
例如:
public ArrayList<Car> getSortedDescMPG() {
ArrayList<Car> lotSortedByMPG = new ArrayList<Car>(myCars);
Car car;
for (Car c : lotSortedByMPG) {
double currentMax = c.getMPG();
car = c;
int currentMaxIndex = lotSortedByMPG.indexOf(c);
for (Car c2 : lotSortedByMPG) {
if (currentMax < c2.getMPG()) {
currentMax = c2.getMPG();
car = c2;
currentMaxIndex = lotSortedByMPG.indexOf(c2);
}
}
if (currentMaxIndex != lotSortedByMPG.indexOf(c)) {
lotSortedByMPG.set(currentMaxIndex, c);
lotSortedByMPG.set(lotSortedByMPG.indexOf(c), car);
}
}
return lotSortedByMPG;
}
我正在尝试将已排序的列表放入CarLotApp中的TextArea中。在CarLotApp中,我还有三个按钮,一个用于添加汽车,一个用于排序asc,一个用于排序desc,还有一个组合框用于选择要排序的实例变量。
class SortDesc extends WidgetViewerActionEvent {
@Override
public void actionPerformed(ActionEvent event) {
txtrSortedCarLot.setText("");
if (cmbSortOptions.getSelectedIndex() == 0)
txtrSortedCarLot.setText(myCarLot.toString());
else if (cmbSortOptions.getSelectedIndex() == 1)
txtrSortedCarLot.setText(CarLot.toString(myCarLot.getSortedDescMPG()));
else if (cmbSortOptions.getSelectedIndex() == 2)
etc...
}
}
主要问题是从我的排序方法吐出的ArrayLists出了故障。我查找了类似的帖子,但它们都与专注于使用比较器进行排序的帖子相关联。我想在不使用隔间的情况下这样做。那么我真的不知道要搜索什么,因为我可以告诉我的排序方法应该有效。所以我不知道我做错了什么。
答案 0 :(得分:0)
当您进行选择排序时,数组或列表的开头将变为排序,您不应该在那里寻找最大值。您更愿意在列表的余数中找到最大值,该值仍未排序。相反,您的代码反复找到具有最大MPG的同一辆车。
这是一个有效的选择:
public static ArrayList<Car> getSortedDescMPG() {
ArrayList<Car> lotSortedByMPG = new ArrayList<>(myCars);
for (int i = 0; i < lotSortedByMPG.size(); i++) {
// At the beginning of each iteration, cars 0 through (i-1) are sorted
// Find the max-MPG car with index in the range (i, size-1) inclusive
Car carI = lotSortedByMPG.get(i);
int maxIndex = i;
Car maxCar = carI;
int maxMPG = carI.getMPG();
for (int j = i + 1; j < lotSortedByMPG.size(); j++) {
Car curCar = lotSortedByMPG.get(j);
int curMPG = curCar.getMPG();
if (curMPG > maxMPG) {
maxIndex = j;
maxCar = curCar;
maxMPG = curMPG;
}
}
// Now swap the max-MPG car (at index maxIndex) with car i (at index i)
lotSortedByMPG.set(i, maxCar);
lotSortedByMPG.set(maxIndex, carI);
}
return lotSortedByMPG;
}