2015-01-28 2 views
0

Хорошо, поэтому я создал сценарий автопробега в java. Он имеет два класса. Класс Car и класс TheRace.как сортировать данные из пользовательского класса

Car класс только имеет материал о машине, как расстояния, пройденное автомобилем, и в TheRace, у меня есть два массива для водителей (driverArray) и спонсоров (sponsors). Я создал массив классов Car, чтобы каждый драйвер имел разные скорости и расстояние.

Во всяком случае, как вы можете видеть, что я сделал boolean под названием winner, и 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; 
} 


} 
+2

Здесь есть * целый ряд * кода, с очень небольшим количеством дисков для того, что вы пытаетесь сделать. Попробуйте перефразировать ваш вопрос следующим образом: ожидаемый ввод, ожидаемый результат и минимальный подмножество вашего кода необходимо **, чтобы описать проблему/дать нам знания вашей структуры данных для создания решения. В противном случае все просто похоже на шум. Например, прямо сейчас вы даже не указали, как вы хотите отсортировать массивы, что в значительной степени является основой вопроса. – aruisdante

+3

Итак, вопрос в том, как отсортировать массив объектов 'Car' по полю' totalOdMiles'? Или я неправильно понял? Если это вопрос, то очень похожие вопросы задавали _many_ раз раньше. Вероятно, вы захотите написать «Компаратор» для объектов «Car», а затем использовать метод 'sort' класса' Arrays'. –

+0

Вы отправили кучу кода, который не имеет никакого отношения к вашему фактическому вопросу, пожалуйста, постарайтесь быть как можно более конкретными. –

ответ

0

Хава взглянуть на этот обычай компаратор,

положить этот код после 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); 

Это даст вам ряды всех драйверов в порядке убывания наряду с их соответствующей скоростью.

+0

Хорошо, получилось, спасибо – user3450126

-1

вашего автомобиль класс может imlpement сопоставимого интерфейса:

public class Car implements Comparable<Car> 

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

и вы можете отсортировать массив в конце вашего времени:

Arrays.sort(carList); 

это надо как-то работать, я думаю :)

+0

«это должно как-то работать, я думаю» - нет, это не так, и вы не отвечаете, если не уверены, будет ли ваше решение работать или нет. –

0

Я предлагаю простое решение, основанное на том, что я думаю, что вы просите.

Просто создайте новый массив carPlace [] (в качестве примера) и добавьте carList [i] в ​​этот массив, как только закончите. Таким образом, 1-е место будет carPlace [0], 2-е место автомобиляPlace [1] и т. Д.

Как только все машины размещены, вы можете выйти из цикла while, как и раньше.

Возможно, вы не захотите, чтобы ваш цикл прерывался, как только был найден победитель, так как этот метод требует добавления всех машин в массив.

Если это не то, что вы просите, пожалуйста, укажите ...

Счастливый кодирования!

+0

Ну, как только они заканчиваются, это проблема. Вы видите, что у меня есть цикл for, который будет запускать массив драйверов до тех пор, пока не выиграет один человек, если победит 15-й драйвер, он будет похож на 15 побед, а затем отобразит 5 других игроков. Если водитель 19 победит, он будет похож на 19 побед, а затем отобразит 1 другой драйвер – user3450126

1

В идеале вам следует избегать проблемы одновременного сортировки двух массивов путем добавления поля currentDistance к классу Car. Затем вы можете сортировать carList с помощью currentDistance.

Например, с помощью Java 8 вы можете получить первые 3 места с:

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

Я не думаю, что это то, что я искал. Вы видите, что у меня есть цикл for, который будет запускать массив драйверов до тех пор, пока не выиграет один человек, если победит 15-й драйвер, он будет похож на 15 побед, а затем отобразит 5 других игроков. Если победитель 19 победит, он будет похож на 19 побед, а затем отобразит 1 другой драйвер. Поэтому я хочу, чтобы цикл или функция отображали правильный порядок их завершения. Thnx – user3450126

Смежные вопросы