Java 如何对自定义类中的数据进行排序

Java 如何对自定义类中的数据进行排序,java,arrays,class,sorting,Java,Arrays,Class,Sorting,我用java编写了一个赛车脚本。它有两个类。汽车级和自行车级 汽车类只是有一些关于汽车的东西,比如汽车行驶的距离,在这个空间里,我有两个阵列供司机和赞助商使用。我制作了一个汽车类数组,这样每个司机都有不同的速度和行驶距离 不管怎样,正如你所看到的,我做了一个叫做winner的布尔运算,还有一个while循环,它将一直运行,直到winner为真。在while循环中,驾驶员距离变得越来越远,直到myDistance等于或大于100 在代码中可以看到,ifcarList[i].myDistance>=

我用java编写了一个赛车脚本。它有两个类。汽车级和自行车级

汽车类只是有一些关于汽车的东西,比如汽车行驶的距离,在这个空间里,我有两个阵列供司机和赞助商使用。我制作了一个汽车类数组,这样每个司机都有不同的速度和行驶距离

不管怎样,正如你所看到的,我做了一个叫做winner的布尔运算,还有一个while循环,它将一直运行,直到winner为真。在while循环中,驾驶员距离变得越来越远,直到myDistance等于或大于100

在代码中可以看到,ifcarList[i].myDistance>=100{winner=true;},然后我显示获胜者

我一直在努力使它显示所有最终越过终点线100的人,并以他们完成的正确顺序显示他们。比如对数组排序之类的。我怎样才能展示每个人都得到了什么。我该怎么做

太空舱


您的汽车类可以实现类似的界面:

public class Car implements Comparable<Car>

@Override
public int compareTo(Car o) {
    return this.totalOdMiles < o.totalOdMiles ? 0 : 1;
}

我想这应该是可行的:

我根据我认为你的问题提出了一个简单的解决方案

只需创建一个新数组,以carPlace[]为例,并在完成后立即将carList[i]添加到该数组中。 这样一来,排名第一的将是停车场[0],排名第二的停车场[1]等等

一旦所有的车都放置好了,你们就可以像以前一样打破while循环

不过,您可能不希望在找到赢家后立即中断循环,因为这种方法需要将所有车辆添加到阵列中

如果这不是您所要求的,请指定


快乐编码

理想情况下,通过将currentDistance字段添加到Car类中,可以避免同时对两个数组进行排序的问题。然后可以使用currentDistance对carList进行排序

例如,使用java 8可以获得前3个位置:

Arrays.stream(carList)
    .sorted((c1, c2) -> c2.currentDistance - c1.currentDistance)
    .map(c -> c.getName())
    .limit(3);

看看这个定制比较器

将此代码放在while循环之后

输出:

要列出前5个位置,请使用此选项

for (int i=0; i<5; i++){
    System.out.println(carList[i].myDistance() + " " + carList[i].myName() + ", -- Rank: " + (i+1));
}

这将以降序排列所有驱动程序的等级以及它们各自的速度。

那里有大量代码,几乎没有什么可以驱动您尝试执行的操作。请尝试用以下内容重新表述您的问题:描述问题所需的预期输入、预期输出和代码的最小子集/为我们提供生成解决方案所需的数据结构知识。否则一切都像噪音。例如,现在你还没有指定你想要如何排序数组,这几乎是问题的基础。所以问题是如何用TooDrOrm字段排序汽车对象数组?还是我误解了?如果这是一个问题,那么以前也曾多次提出过类似的问题。您可能想为Car对象编写一个比较器,然后使用Arrays类的sort方法。您发布了一堆与实际问题无关的代码,请尽量具体。这对每个人都好吗?@user3450126,请查看我对Java8和以前版本的Java8的更新答案,一旦它们完成,问题就来了。你看,我有一个for循环,它将运行驱动程序数组,直到一个人赢,如果15个驱动程序赢了,它将像驱动程序15个赢一样,然后显示其他5个玩家。如果19号车手赢了,那就像19号车手赢了一样,然后显示另外一个车手我不认为这就是我要找的。你看,我有一个for循环,它将运行驱动程序数组,直到一个人赢,如果15个驱动程序赢了,它将像驱动程序15个赢一样,然后显示其他5个玩家。如果驱动程序19获胜,它将像驱动程序19获胜一样,然后显示另一个驱动程序。所以我有点想要一个循环或函数,它将在它们完成时显示正确的顺序。Thnx我想这应该是可行的-不,不会,如果你不确定你的解决方案是否可行,你也不会回答。
Arrays.sort(carList);
Arrays.stream(carList)
    .sorted((c1, c2) -> c2.currentDistance - c1.currentDistance)
    .map(c -> c.getName())
    .limit(3);
Collections.sort(Arrays.asList(carList), new Comparator<Car>() {
            @Override
            public int compare(Car o1, Car o2) {
                return Float.compare(o2.myDistance(), o1.myDistance());
            }
        });
        for (Car s : carList){
            System.out.println(s.myDistance() + " " + s.myName());
        }
THE WINNER OF THE RACE IS:  Andrew Johnson  For team: CocaCola
100.004135 Andrew Johnson
99.623375 Jesus Defualt
99.23477 Andrew Smith
99.20563 Andrew Andrew
98.94183 Jesus Defualt
98.87631 Blondey Gold
98.86331 Jesus Defualt
98.64405 steave smith
98.54269 Jason seglad
98.24685 Bob Joe
98.23995 Andrew Kosevsky
98.06155 Ricky Bobby
97.81364 Jess TheHellItIs
97.77215 Blondey Gold
97.72567 Ashey GirslCanDriveTo
97.57001 Ashey GirslCanDriveTo
97.54619 Cheese farlin
97.29426 Andrew Kralovec
96.68102 Andrew Kosevsky
96.018654 Ashey GirslCanDriveTo
for (int i=0; i<5; i++){
    System.out.println(carList[i].myDistance() + " " + carList[i].myName() + ", -- Rank: " + (i+1));
}
    Arrays.stream(carList)
            .sorted((a, b) -> Float.compare(b.myDistance(), a.myDistance()))
            .map(c -> c.myDistance() + " " + c.myName())
            .forEachOrdered(System.out::println);