如何对来自自定义 class 的数据进行排序

how to sort data from a custom class

好的,所以我在 java 中制作了一个赛车脚本。它有两个 classes。 Carclass和TheRaceclass。

Car class 只是关于汽车的东西,比如汽车行驶的距离,而在 TheRace 中,我有两个数组用于 driver (driverArray) 和赞助商 (sponsors)。我制作了一个 Car class 数组,因此每个 driver 都有不同的速度和行进距离。

无论如何,如您所见,我制作了一个名为 winnerboolean 和一个 while 循环,该循环将一直持续到 winnertrue. drivers 距离在while 循环中变得越来越大,直到myDistance 等于或大于100

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

我一直在努力让它显示所有最终越过终点线的人 100 ,并按照他们完成的校正顺序显示他们。比如排序数组之类的。我如何显示每个人都得到了什么地方。我该怎么做?

TheRace class,

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 

}

Car class,

package NASCAR;
import java.util.Random;
public class Car {
//variables
 private float totalOdMiles ;
 private float speedPerHour ;
 private String driverName ;
 private String sponsorName ;
 private Random rand = new Random();


public Car(String driverName, String sponsorName){
this.driverName = driverName ; 
this.sponsorName = sponsorName ;
this.totalOdMiles = 0; 
this.speedPerHour = rand.nextInt( 60); 
}

public String myName(){
this.driverName = driverName;
return driverName ;         
}
public String myTeam(){
this.sponsorName = sponsorName;
return sponsorName ;    
}

public float myDistance(){ //reprot distance 
return totalOdMiles; 
}

public void speedChange(){ //ChangeSpeed()
this.speedPerHour = rand.nextInt(60); 
}

public void changeDistance(){ //UpdateProgress()
float milesPerSecond = this.speedPerHour / 3600;
this.totalOdMiles+=milesPerSecond;    
}

public String trackProgress(){ //ToString()
return this.driverName +" driving  the "+ this.sponsorName+" car is going "+ this.totalOdMiles +"MPS "+this.totalOdMiles;
}


}

你的车 class 可以实现 Comparable 接口:

public class Car implements Comparable<Car>

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

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

Arrays.sort(carList);

我想这应该能奏效 :)

我根据您的要求提出一个简单的解决方案。

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

所有汽车都放置好后,就可以像以前一样跳出 while 循环了。

不过,您可能不希望在找到获胜者后立即中断循环 - 因为此方法需要将所有汽车都添加到数组中。

如果这不是您要问的,请说明...

编码愉快!

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

对 carList 进行排序

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

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

看看这个自定义比较器,

将此代码放在 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);

这将为您提供所有车手的排名以及他们各自的速度。