Отсортировать массив java

207
15 декабря 2017, 02:35

Не могу отсортировать массив (скорее всего нужен по убыванию). В задании стоит задача вывести двух самых высоких людей, то есть найти два максимальных числа (в файле txt у меня записаны имена и рост каждого человека). Помогите пожалуйста, я уже больше месяца мучаюсь! Все, что мне говорят - "отсортируй массив", "используй метод sort" и все в таком роде. Я это всё прекрасно понимаю, но у меня не получается. Может кто-то написать саму сортировку именно для моей программы? Пожалуйста!!! (Сортировка нужна в конце программы, я комментарием отметила место)

package lab22; 
//Определить двух высоких студентов
import java.io.BufferedReader; 
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
public class ex1 { 
public static void main(String[] args) throws IOException { 
    ArrayList <Svedenia> arr = new ArrayList <Svedenia> (); 
    BufferedReader in = null; 
    try { 
        in = new BufferedReader(new FileReader("Z:\\Документы\\Новая папка\\in.txt"));
        String s; 
        int n = 0; 
        System.out.println("______________________"); 
        while((s = in.readLine()) != null) { 
            int p = s.indexOf(","); 
            Svedenia sved = new Svedenia(s.substring(0, p), Double.parseDouble(s.substring(p+1))); 
            arr.add(sved); 
            System.out.printf("|%10s%10.2f|\n", 
                    arr.get(n).getName(), 
                    arr.get(n).getResult()); 
            n++;
        } 
    }
    finally { 
        in.close(); 
    }       
    FileWriter out = new FileWriter("Z:\\Документы\\Новая папка\\out.txt"); 
    System.out.println("Фамилия: "); 
    double max=0,max2=0;
    int n = 0;
//СОРТИРОВКА:     
    Collections.sort(arr, new  Comparator<Svedenia>(){
        public int compare(Svedenia o1, Svedenia o2) {
            return o1.toString().compareTo(o2.toString());
    }});
    System.out.println(o1); 
    System.out.println(o2); 
    for(Svedenia entry:arr){
        if ((entry.getResult()==max)||(entry.getResult()==max2)){
            System.out.println(entry.getResult() + ", " + entry.getName()); 
            out.write(entry.getResult() + ", " + entry.getName() + "\r\n"); 
        }
    }
    out.close(); 
    } 
}

И вторая программа (Сведения):

package lab22; 
public class Svedenia { 
    private String name; 
    private double result;
    public Svedenia(String n, double r) { 
        name = n; 
        result = r; 
    } 
    public String getName() { 
        return name; 
    } 
    public double getResult() { 
        return result; 
    } 
}
Answer 1
Collections.sort(arr, new  Comparator<Svedenia>(){
    public int compare(Svedenia o1, Svedenia o2) {
        return o1.toString().compareTo(o2.toString());
}});

У вас в компараторе объект приводится к строке - вызывается метод toString, который не переопределен в классе Svedenia. Чтобы компаратор работал правильно, нужно либо переопределить метод toString, например так:

@Override
public String toString(){
    return name + " " + result;
}

либо, этот вариант более правильный, реализовать в классе Svedenia интерфейс Comparable и, соответственно, написать метод compareTo, например так (тогда не надо будет вызывать toString):

@Override
public int compareTo(Svedenia s){
    int cmp = name.compareTo(s.getName());
    if(cmp == 0) cmp = Double.compare(result, s.getResult());
    return cmp;
}

и написать так:

Collections.sort(arr, new  Comparator<Svedenia>(){
    public int compare(Svedenia o1, Svedenia o2) {
        return o1.compareTo(o2);
}});
Answer 2

Для начала в вашей "программе" Сведения переопределите метод compareTo А дальше, что - то типо такого:

arr= arr.stream()
        .sorted((f1, f2) -> Long.compare(f2, f1))
        .collect(Collectors.toCollection(ArrayL‌​ist::new)); 
Answer 3
//Определить двух высоких студентов
import java.io.BufferedReader; 
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
public class ex1 { 
public static void main(String[] args) throws IOException { 
    ArrayList <Svedenia> arr = new ArrayList <> (); 
    try (BufferedReader in = new BufferedReader(new FileReader("Z:\\Документы\\Новая папка\\in.txt"))) {
        String s; 
        int n = 0; 
        System.out.println("______________________"); 
        while((s = in.readLine()) != null) { 
            int p = s.indexOf(","); 
            Svedenia sved = new Svedenia(s.substring(0, p), Double.parseDouble(s.substring(p+1))); 
            arr.add(sved); 
            System.out.printf("|%10s%10.2f|\n", 
                    arr.get(n).getName(), 
                    arr.get(n).getResult()); 
            n++;
        } 
    }
    Collections.sort(arr, (Svedenia o1, Svedenia o2) -> o2.getResult().compareTo(o1.getResult()));
    System.out.println(arr.get(0));
    System.out.println(arr.get(1));
    } 
}
class Svedenia { 
    private final String NAME; 
    private final Double RESULT;
    public Svedenia(String name, Double result) { 
        this.NAME = name; 
        this.RESULT = result; 
    } 
    public String getName() { 
        return NAME; 
    } 
    public Double getResult() { 
        return RESULT; 
    } 
    @Override
    public String toString() {
        return NAME + ", " + RESULT;
    }
}
READ ALSO
Некорректная работа плагина maskedinput

Некорректная работа плагина maskedinput

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

283
Стоит ли интегрировать jquery плагин в проект построенный на ReactJS?

Стоит ли интегрировать jquery плагин в проект построенный на ReactJS?

При переводе проекта на React столкнулся с тем такой плагинАналогичного плагина, но на React'е я не нашел

282
Как вставить этот код перед body с помощью js

Как вставить этот код перед body с помощью js

Есть код партнерки, как его можно вставить в тело html, перед body? с помощью js вот код :

331