Как отсортировать строки с целыми числами и буквами в порядке от наименьшего к наибольшему? (Java) - PullRequest
2 голосов
/ 02 марта 2020

Мне дали задание, в котором я должен:

A) Использовать список массивов

и

B) Из набора данных (то есть в текстовый файл), содержащий время окончания бегуна и его пол, выведите время в следующем порядке: самое быстрое время, самое быстрое время мужчины и самое быстрое время женщины.

Например, файл будет выглядеть примерно так:

6
48 F
52 M
43 F
49 F
50 M
57 F

Где в первой строке указано количество бегунов и другие строки - время каждого бегуна и его пол (M для мужчины, F для женщины)

, затем компьютер должен напечатать что-то вроде:

43 48 50

Примечание как вторая самая быстрая женщина получила звание «самой быстрой женщины», потому что тот, кто участвовал в гонке в 43 году, получил «самый быстрый общий титул».

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

Пока что я достиг того, что я успешно прочитал и перенес данные в файл и сохранил их как ArrayList в системе. Вот версия Arraylist:

    public class RaceClient {
    public static void main(String [] args) throws IOException {
    Scanner inFile = new Scanner(new File("input.txt"));

    ArrayList<String> times = new ArrayList<>();
    ArrayList timesnum = new ArrayList();

    while(inFile.hasNext()) {
        times.add(inFile.nextLine()); 
            }//end of while
     times.remove(0);
     int i=0;

     while( i <times.length()) {
         timesnum[i]= Integer.parseInt(times[i]);
     }

System.out.println(times);
}//end of main

    }//end of class

Любые предложения о том, что я должен делать или что я должен импортировать, было бы здорово

Ответы [ 3 ]

3 голосов
/ 02 марта 2020

Это очень быстрый код, но, надеюсь, он укажет вам правильное направление.

На вашем месте я бы сначала создал очень простой объект участника:

public class Participant implements Comparable {

    String time;
    String sex;

    public Participant(String time, String sex) {
        this.time = time;
        this.sex = sex;
    }

    public String getTime() {
        return time;
    }

    public String getSex() {
        return sex;
    }

    @Override
    public int compareTo(Object o) {
        return this.getTime().compareTo(((Participant) o).getTime());
    }
}

Наш объект Участник имеет понятие времени и пола, очень простое. Мы также хотим, чтобы он реализовал Comparable и переопределенный метод compareTo() - это необходимо, чтобы мы могли сравнивать наши объекты-участники по времени.

Далее, для каждой строки в файле (кроме первой, поскольку это просто показывает количество участников), давайте создадим соответствующие объекты участников и добавим их в ArrayList. Я собираюсь сделать это с помощью BufferedReader:

        BufferedReader in = new BufferedReader(new FileReader("...your-file..."));
        ArrayList<Participant> participants = new ArrayList<>();
        String str;

        //skip first line
        in.readLine();
        while ((str = in.readLine()) != null){
            //Split every line entry by space, so split e.g. 49 F into time 49 and sex F
            String[] splitString = str.split(" ");
            Participant p = new Participant(splitString[0], splitString[1]);
            participants.add(p);
        }

Затем, давайте отсортируем ArrayList наших участников:

Collections.sort(participants);

Далее, мы сразу можем сказать, у кого самое быстрое время - это будет первым в ArrayList, независимо от пола. После того, как мы получим самое быстрое время, мы можем удалить его из ArrayList, поскольку мы больше не заботимся о нем:

System.out.println("Fastest Time: " + participants.get(0).getTime());
participants.remove(participants.get(0));

Далее, нам нужно решить, что будет следующим самым быстрым временем - это мужчина или Женское самое быстрое время? Давайте создадим отдельный приватный метод для этого:

private static void determineFastestSexTime(ArrayList<Participant> participants) {
    if (participants.get(0).getSex().equals("M")) {
        System.out.println("Fastest Male Time: " + participants.get(0).getTime());
    } else {
        System.out.println("Fastest Female Time: " + participants.get(0).getTime());
    }
}

Затем используйте его следующим образом:

 determineFastestSexTime(participants);

Как только мы получим это, мы можем удалить все остальные времена для этого пола, так как они будет медленнее, чем самое быстрое (половое) время:

participants.removeIf(p -> (p.getSex().equals(participants.get(0).getSex())));

Поэтому у нас остается только мужской список или женский список участников. Тогда легко - захватите самое быстрое время отдыха:

 determineFastestSexTime(participants);

Вывод:

Fastest Time: 43
Fastest Female Time: 48
Fastest Male Time: 50
1 голос
/ 02 марта 2020

Я бы сделал три функции по одной для каждого требования. Это может быть не лучшим способом, но это работает. Кроме того, я не делал никакой работы в Java в последнее время.

Не стесняйтесь задавать мне больше вопросов. Вот решение вашей проблемы:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;


public class StackOverflowProblem{

     public static void main(String []args){
        List<Runner> allRunners = new ArrayList<Runner>();

        //Add Runners to Array
        allRunners.add(new Runner(10.23, "FEMALE"));
        allRunners.add(new Runner(14.21, "MALE"));
        allRunners.add(new Runner(16.15, "FEMALE"));
        allRunners.add(new Runner(10.15, "FEMALE"));


        //Max Time
        Runner fastestRunner=getMaxTime(allRunners);

        System.out.println("FASTEST TIME");
        System.out.println(
            "Time: "+fastestRunner.getTime()+"\n"+
            "Gender: "+fastestRunner.getGender()+
            "\n"
        );


        //Fastest Female Time
        Runner fastestFemaleRunner=getMaxTimeFemale(allRunners);

        System.out.println("FASTEST FEMALE TIME");
        System.out.println(
            "Time: "+fastestFemaleRunner.getTime()+"\n"+
            "Gender: "+fastestFemaleRunner.getGender()+
            "\n"
        );


        //Fastest Male Time
        Runner fastestMaleRunner=getMaxTimeMale(allRunners);

        System.out.println("FASTEST MALE TIME");
        System.out.println(
            "Time: "+fastestMaleRunner.getTime()+"\n"+
            "Gender: "+fastestMaleRunner.getGender()+
            "\n"
        );

     }

     static class Runner{
        public double time;
        public String gender;

        public Runner(double time, String gender){
            this.time=time;
            this.gender=gender;
        }

        public Double getTime() {
            return this.time;
        }

        public String getGender(){
            return this.gender;
        }

     }



     public static Runner getMaxTime(List<Runner> allRunners){
        Runner max_runner=allRunners.stream()
            .min(Comparator.comparingDouble(Runner::getTime))
            .get();

        return max_runner;
     }

     public static Runner getMaxTimeFemale(List<Runner> allRunners){
        Runner maxFemaleRunner=allRunners.stream()
            .filter(runner->runner.getGender().equals("FEMALE"))
            .min(Comparator.comparingDouble(Runner::getTime))
            .get();

        return maxFemaleRunner;
     }

     public static Runner getMaxTimeMale(List<Runner> allRunners){
        Runner maxMaleRunner=allRunners.stream()
            .filter(runner->runner.getGender().equals("MALE"))
            .min(Comparator.comparingDouble(Runner::getTime))
            .get();

        return maxMaleRunner;
     }

}
0 голосов
/ 02 марта 2020

Так как вы используете arrayList, получение суммы в верхней части файла кажется странным, как если бы вы использовали массив, вам теперь нужно узнать, насколько велика его инициализация как.

I будет принимать Java как объектно-ориентированный язык. Что вы можете сделать, это создать класс Runner с полями (int speed, char sex). Таким образом, массив arrayList может содержать все Runners, это был бы хороший способ сортировки с использованием перезаписанного метода compareTo внутри класса Runner. После того, как они отсортированы, вы можете go через arrayList распечатать в порядке самых быстрых времен, а затем распечатать самые быстрые мужские и женские.

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

...