【问题标题】:how to sort data from a custom class如何对自定义类中的数据进行排序
【发布时间】:2015-01-28 20:48:09
【问题描述】:

好的,所以我用 java 制作了一个赛车脚本。它有两个类。 Car 类和 TheRace 类。

Car 类只包含有关汽车的信息,例如汽车行驶的距离,在 TheRace 中,我有两个数组用于驱动程序 (driverArray) 和赞助商 (sponsors)。我制作了一个Car 类数组,因此每个司机都有不同的速度和行驶距离。

无论如何,如您所见,我创建了一个名为 winnerboolean 和一个 while 循环,该循环将一直持续到 winnertrue。驾驶员距离在while 循环中变得越来越大,直到myDistance 等于或大于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 

}

Car 类,

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;
}


}

【问题讨论】:

  • 那里有一大堆代码,几乎没有什么可以驱动你想要做的事情。请尝试用以下内容重新表述您的问题:预期输入、预期输出和 您的代码的最小子集来描述问题/向我们提供您的数据结构的知识以生成解决方案。否则一切都只是噪音。例如,现在您甚至还没有指定要如何对数组进行排序,这几乎是问题的基础。
  • 那么问题是如何通过totalOdMiles 字段对Car 对象数组进行排序?还是我误会了?如果这就是问题所在,那么之前已经多次问过非常相似的问题。您可能想为Car 对象编写Comparator,然后使用Arrays 类的sort 方法。
  • 您贴了一堆与您的实际问题无关的代码,请尽量具体。
  • 这对每个人都更好吗?
  • @user3450126,请查看我对 Java 8 和以前版本的 Java 的更新答案

标签: java arrays class sorting


【解决方案1】:

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

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

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

【讨论】:

  • 我不认为这是我想要的。您会看到我有一个 for 循环,它将运行驱动程序数组,直到一个人获胜,如果 15 名驱动程序获胜,那么它将像驱动程序 15 获胜,然后显示其他 5 名玩家。如果驱动程序 19 获胜,则就像驱动程序 19 获胜然后显示另外 1 个驱动程序。所以我有点想要一个循环或函数,然后显示它们何时完成的正确顺序。谢谢
【解决方案2】:

看看这个自定义比较器,

将此代码放在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】:

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

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

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

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

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

    编码愉快!

    【讨论】:

    • 好吧,一旦他们完成就有点问题了。您会看到我有一个 for 循环,它将运行驱动程序数组,直到一个人获胜,如果 15 名驱动程序获胜,它将就像驱动程序 15 获胜一样,然后显示其他 5 名玩家。如果驱动程序 19 获胜,则就像驱动程序 19 获胜然后显示其他 1 驱动程序
    【解决方案4】:

    您的汽车类可以实现 Comparable 接口:

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

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

    Arrays.sort(carList);
    

    我猜这应该会起作用:)

    【讨论】:

    • “我猜这应该可以工作”——不,它不会,如果你不确定你的解决方案是否有效,你不会回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2017-04-09
    • 2019-12-02
    • 2022-07-11
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多