Java按制造商、型号和年份按升序查找最旧的汽车型号?
我试图在一份未分类的汽车列表中找到每个汽车制造商最古老的车型。我正在按制造商、型号和年份按字母升序对该列表进行排序,代码如下:Java按制造商、型号和年份按升序查找最旧的汽车型号?,java,algorithm,sorting,Java,Algorithm,Sorting,我试图在一份未分类的汽车列表中找到每个汽车制造商最古老的车型。我正在按制造商、型号和年份按字母升序对该列表进行排序,代码如下: 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 Fi
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)");
}
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.ArrayList;
导入java.util.Scanner;
公开课演示{
公共静态void main(字符串[]args)引发FileNotFoundException{
扫描仪键盘=新扫描仪(System.in);
System.out.println(“输入文件名”);
字符串输入=键盘.nextLine();
文件=新文件(输入);
扫描仪=新扫描仪(文件);
scanner.nextLine();
ArrayList=新建ArrayList();
while(scanner.hasNextLine())
{
字符串[]arr=scanner.nextLine().split(“\t”);
list.add(新车(arr[0],arr[1],Integer.parseInt(arr[2]));
}
对于(int end=list.size()-1;end>=1;end--)
{
用于(int电流=0;电流0)
{
车辆温度=列表获取(当前);
list.set(当前,list.get(当前+1));
列表设置(电流+1,温度);
}
}
}
System.out.println(“制造的最旧汽车”);
Car=null;
整数计数=0;
对于(int i=0;i
当我输入cars-full.txt()时,未排序的列表将正确排序,如您在此处所见:()
在对该列表进行排序后,我将按最早年份确定每个制造商的“最早”型号,如果同一年有多个型号,则按型号名称的字母升序进行排序。下面是我的输出(右)的图片,与根据我的老师(左)的预期输出相比,使用cars-list.txt作为上面链接的输入:
请注意他的“最老”路虎车型是Discovery,它与Defender共享一个制造年份,据我所知,e在I之前,因此Defender应该是输出。我的理论是,我的后端代码正在对照cars-full.txt版本进行检查,该版本不包括Land Rover Defender
同一位教授的第100个Fibonnaci索引的输出不正确,所以过去他们自动检查我作业的后端代码有错误
谁错了,我还是他们?如果是我,我如何更正代码?您的实现似乎是正确的。我只想在这里推荐一个小改动。而不是编写自定义比较器来对
Car
列表进行排序。您可以在一行中这样做:
list.sort(Comparator.comparing(Car::getMake).thenComparing(Car::getModel).thenComparing(Car::getYear));
它将使您的代码不那么冗长和简洁
<> P>你也是正确的,<代码>“防御者> <代码>将永远出现在<代码>发现> <代码>词典中,除非<代码>路虎防御者1994 行在数据集中丢失,这可能是这里的情况。你可以肯定地认为De低于DI,因为字母表。太简单了。。可能教授的txt和你的不一样。好吧,列表中最古老的路虎车型是94年的Defender和94年的Discovery。但94年的发现在未分类的名单中出现的时间比任何一位捍卫者都要早。因此,profs algo可能只是从上到下运行了列表,只查看了制造商和年份,它看到的第一辆路虎是'94发现,没有老路虎跟随,所以它选择了这辆。@KevinAnderson感谢您的洞察力并查看了列表,我想你可能在那里发现了什么。@KevinAnderson,但在这种情况下,
Land Rover Discovery 2012
将是输出。因为此条目位于开始处,Land Rover Discovery 1994
位于结束处。这里可能不是这样。因为没有排序,其他制造商也会给出错误的输出。查看数据集,我可以看到Land Rover Defender 1994
位于第74行,Land Rover Discovery 1994
位于第927行。这意味着在未分类的列表中,94年的Defender排在94年的Discovery之前。感谢您的回复,我喜欢您的建议。我只需要提交在我的课堂上已经教过的代码,遗憾的是这还没有被引入。不过,对于一个更高级的Java程序员来说,我喜欢这样。@davidstanpher好吧,那么您可能必须坚持自己的实现。也许这对将来的其他人会有帮助。您不必担心输出中的不匹配。数据集可能在此处更改,否则Discovery
不能在Defender
之前出现。