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

时间:2015-01-28 20:48:09

标签: java arrays class sorting

好的,所以我在java中制作了赛车脚本。它有两个类。 Car班级和TheRace班级。

Car课只有车的内容,就像汽车行驶的距离一样,在TheRace中,我有两个驱动程序阵列(driverArray)和赞助商({ {1}})。我制作了一个sponsors类数组,因此每个驱动程序都有不同的速度和行进距离。

无论如何,正如您所看到的那样,我创建了一个名为Car的{​​{1}}和一个boolean循环,该循环将持续到winnerwhile。在winner等于或大于true之前,驱动程序距离在while循环中变得越来越大。

在代码中你可以看到myDistance,然后我显示了Winner。

我一直试图让它显示所有最终越过终点线100的人,并以他们完成的修正器顺序显示它们。就像排序数组一样。我怎样才能展示每个人都有的地方。我该怎么做?

if(carList[i].myDistance() >= 100){ winner = true;}上课,

100

TheRace上课,

package NASCAR;
import java.util.Arrays;
import java.util.Random;
public class TheRace {
// variables 
public static  String[] driverArray = {"steave smith", "Cheese farlin","Bob Joe","Josh Svioda", "Andrew Kralovec", "Ricky Bobby","Ashey GirslCanDriveTo","Kelsey IAgree","Joe ThisIsAManSport","Jess TheHellItIs","Jesus Defualt","Jason seglad","Andrew Smith","Andrew Johnson","Andrew Kosevsky","Andrew Anderson","Andrew Andrew", "Kate Andrew","Blondey Gold","Golden Blonde","Im Twenty" };
public static String[] sponsors = {"CocaCola","Pepsi","CoorsLight","GOD"} ;
public int[] currentDistance = new int[20]; 

public static void main(String[] args) {
     Car[] carList = new Car[20] ; 
    Random rand = new Random();

     for(int i =0 ; i < carList.length;i++){
         carList[i] = new Car(driverArray[rand.nextInt(20)], sponsors[rand.nextInt(4)]) ;
     } //end for 

     int lapCounter = 0 ; 
     boolean winner = false;
     while(!winner){

        for(int i = 0; i < carList.length; i++){
            carList[i].changeDistance();
            if(lapCounter % 6 == 0){
                carList[i].speedChange();                   
            } // end if change speed 

            System.out.println(carList[i].trackProgress());
            if(carList[i].myDistance() >= 100){
                winner = true;
                System.out.println("_____ THE WINNER OF THE RACE IS:  "+carList[i].myName()+"  For team: "+carList[i].myTeam()); 
                break ; 
            }

        }// end for 
        lapCounter++;
        System.out.println("---------------------------------");

    } // end while 

    }// end main 

}

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我根据我的想法提出了一个简单的解决方案。

只需创建一个新数组carPlace [](作为示例),并在完成后立即将carList [i]添加到该数组中。 那样第一名将是carPlace [0],第二名是carPlace [1]等。

一旦放下所有车辆,你就可以像以前一样突破while循环。

您可能不希望在找到胜利者后立即让您的循环中断 - 因为此方法需要将所有汽车添加到阵列中。

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

快乐的编码!

答案 2 :(得分:0)

Hava看看这个自定义Comparator,

将此代码放在while循环

之后
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

列出前5个地方,改为使用它,

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

如果您使用的是Java 8,则可以更轻松地完成此操作

    Arrays.stream(carList)
            .sorted((a, b) -> Float.compare(b.myDistance(), a.myDistance()))
            .map(c -> c.myDistance() + " " + c.myName())
            .forEachOrdered(System.out::println);

这将使您按降序排列所有驾驶员的等级以及各自的速度。

答案 3 :(得分:-1)

你的汽车类可能会影响Comparable界面:

public class Car implements Comparable<Car>

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

您可以在结束时对数组进行排序:

Arrays.sort(carList);

这应该以某种方式起作用我想:)