我试图从每一个汽车制造商的未分类汽车列表中找到最老的型号我将按制造商、型号和年份按字母升序排列此列表,代码如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) throws FileNotFoundException {

        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter filename");
        String input = keyboard.nextLine();
        File file = new File(input);
        Scanner scanner = new Scanner(file);
        scanner.nextLine();
        ArrayList<Car> list = new ArrayList<>();
        while (scanner.hasNextLine())
        {
            String[] arr = scanner.nextLine().split("\t");
            list.add(new Car(arr[0], arr[1], Integer.parseInt(arr[2])));
        }


        for (int end = list.size() - 1; end >= 1; end--)
        {
            for (int current = 0; current <= end - 1; current++)
            {
                Car car1 = list.get(current);
                Car car2 = list.get(current + 1);

                int n = car1.make.toLowerCase().compareTo(car2.make.toLowerCase());
                if (n == 0)
                {
                    n = car1.year - car2.year;
                }
                if (n == 0)
                {
                    n = car1.model.toLowerCase().compareTo(car2.model.toLowerCase());
                }
                if (n > 0)
                {
                    Car temp = list.get(current);
                    list.set(current, list.get(current + 1));
                    list.set(current + 1, temp);
                }
            }
        }

        System.out.println("Oldest cars by make");
        Car oldest = null;
        int count = 0;

        for (int i = 0; i < list.size() - 1; i++)
        {
            if (oldest == null)
            {
                oldest = list.get(i);
            }
            if (!list.get(i).make.equals(list.get(i + 1).make) || i == list.size() - 2)
            {

                count++;
                System.out.println(String.format("%15s%25s%5s", oldest.make, oldest.model, oldest.year));
                oldest = null;
            }
        }

        System.out.println(count + " result(s)");
    }
}

当我输入cars-full.txt(https://www.dropbox.com/s/ahqco56lp3jyuk0/cars-full.txt?dl=0)时,未排序的列表将正确排序,如您所见:(https://www.dropbox.com/s/dcrn8bfhxt4d998/cars-full-sorted.txt?dl=0
在对这个列表进行排序之后,我将按最旧年份确定每个制造商的“最旧”型号,如果同一年有多个型号,则按型号名称的字母升序排序。下面是我的输出(右)与我老师的预期输出(左)的对比图片,使用cars-list.txt作为上面链接的输入:
java - Java按制造商,型号和年份升序查找汽车的最旧型号?-LMLPHP
请注意他的“最老”路虎车型是路虎发现,它与路虎卫士共用一年的制造时间,据我所知,e在我之前,所以路虎卫士应该是产量我的理论是,我的教授的后端代码正在检查一个不包括路虎卫士的cars-full.txt版本。
同一位教授的第100个fibonnaci索引的输出不正确,所以过去他们自动检查我作业的后端代码有错误。
谁错了,我还是他们?如果是我,我该如何更正我的代码?

最佳答案

你的实现似乎是正确的。我只想在这里推荐一个小的改变。而不是编写用于排序Car列表的自定义比较器。你可以这样一字排开:

list.sort(Comparator.comparing(Car::getMake).thenComparing(Car::getModel).thenComparing(Car::getYear));

它将使您的代码不那么冗长和简洁。
你也可以说,"Defender"永远不会出现在词典中,除非数据集中缺少了"Discovery"行,这可能是这里的情况。

关于java - Java按制造商,型号和年份升序查找汽车的最旧型号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58569515/

10-10 20:34