Выборочная сортировка экземпляра объекта типа ArrayList объектов, дающих странные результаты - PullRequest
0 голосов
/ 01 мая 2018

У меня есть класс CarLot, класс Car и класс CarLotApp для настройки GUI для него. CarLot - это ArrayList объектов Car. У меня есть методы в CarLot, которые выделяют CarLot на основе переменных экземпляра в Car (make, model, mpg и т. Д.)

Например:

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;
}

Я пытаюсь получить отсортированный список в TextArea в CarLotApp. В 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, выпавшие из моих методов сортировки, вышли из строя. Я искал похожие посты, но все они были связаны с тем, который был сосредоточен на использовании компаратора для сортировки. Я хочу сделать это без использования отсеков. Так что тогда я действительно не знал, что искать, потому что для того, что я могу сказать, мои методы сортировки должны работать. Так что я не знаю, что я делаю не так.

1 Ответ

0 голосов
/ 01 мая 2018

Когда вы делаете сортировку выбора, начало массива или списка становится отсортированным, и вам не следует искать там максимальное значение. Вы скорее хотите найти максимальное значение в остаток списка, который все еще не отсортирован. Вместо этого ваш код неоднократно находил одну и ту же машину с максимальной 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;
}
...