Не могу отсортировать массив (скорее всего нужен по убыванию). В задании стоит задача вывести двух самых высоких людей, то есть найти два максимальных числа (в файле 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;
}
}
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);
}});
Для начала в вашей "программе" Сведения переопределите метод compareTo
А дальше, что - то типо такого:
arr= arr.stream()
.sorted((f1, f2) -> Long.compare(f2, f1))
.collect(Collectors.toCollection(ArrayList::new));
//Определить двух высоких студентов
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;
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей