Cортировка листа по фамилии в файле

234
06 марта 2022, 04:40

Не могу разобраться как сортировать в файле по фамилии

public class Person implements Serializable, Comparable<Person> {
    TreeSet<Person> myPersonArrayList = new TreeSet<>();
    private static int countId = 0;
    public String name;
    public String surname;
    public String secondName;
    public String age;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age.equals(person.age) &&
                Objects.equals(name, person.name) &&
                surname.equals(person.surname) && secondName.equals(person.secondName);
    }
    public Person(String Name,String Surname,String SecondName,String age){
        this.name = Name;
        this.surname = Surname;
        this.secondName = SecondName;
        this.age = age;
    }
    public void SetName(String Name){
        this.name = Name;
    }
    public void SetSurname(String Surname){
        this.surname = Surname;
    }
    public void SetSecondName(String SecondName){
        this.secondName = SecondName;
    }
    public void SetAge(String age) {
        this.age = age;
    }
    public String GetName(){
        return this.name;
    }
    public String GetSurname(){
        return this.surname;
    }
    public String GetSecondName(){
        return this.secondName;
    }
    public String GetAge(){
        return this.age;
    }

    public String toString() {
        return "\n " + name +
                "\n " + surname +
                 "\n " + secondName +
                  "\n " + age + "\n";
    }

    public int compareTo( Person o ){
        if (this.equals( o )){
            return 0;
        }
        return this.GetName().compareTo( o.GetName() );
    }
    public static Person parse(String string) {
        String[] parts = string.split(" ");
        if(parts.length != 4) {
            throw new IllegalArgumentException("Всего элементов в строке должно быть 4!");
        }
        if(!isDate(parts[3])) {
            throw new IllegalArgumentException("Дата записана неверно!");
        }
        return new Person(parts[0], parts[1], parts[2], parts[3]);
    }
    public static boolean isDate(String date) {
        return date.length() == 2 + 1 + 2 + 1 + 4 &&
                isNumber(date.substring(0, 2)) &&
                date.charAt(2) == '.' &&
                isNumber(date.substring(3, 5)) &&
                date.charAt(5) == '.' &&
                isNumber(date.substring(6, 10));
    }
    private static boolean isNumber(String string) {
        for(char ch : string.toCharArray()) {
            if(!isNumber(ch)) {
                return false;
            }
        }
        return true;
    }
    private static boolean isNumber(char ch) {
        return ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' ||
                ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9';
    }
    public int compareBySurname(Person p) {
        return surname.compareTo(p.surname);
    }
    public int compareByDate(Person p) {
        int myYear = Integer.parseInt(age.substring(6, 10));
        int pYear = Integer.parseInt(p.age.substring(6, 10));
        int myMonth = Integer.parseInt(age.substring(3, 5));
        int pMonth = Integer.parseInt(age.substring(3, 5));
        int myDay = Integer.parseInt(age.substring(0, 2));
        int pDay = Integer.parseInt(age.substring(0, 2));
        if(myYear > pYear) {
            return -1;
        } else if(myYear == pYear) {
            if(myMonth > pMonth) {
                return -1;
            } else if(myMonth == pMonth) {
                return pDay - myDay;
            } else {
                return 1;
            }
        } else {
            return 1;
        }
    }
}

то есть в файле сохранены имя, фамилия, отчество и дата рождения Нужно через команду в консоли отсортировать список в файле по фамилиям.

Petrov Petya Petrovich 01.01.1999
public static Boolean removeSurname() throws IOException {
        File file;
        String line;
        Scanner in = new Scanner(System.in);
        Set<Person> res = new TreeSet<>();
        System.out.print("Из какого файла удалить: ");
        line = in.nextLine();
        System.out.print("Какую фамилию удалить: ");
        String lineToRemove;
        String inLine = "";
        lineToRemove = in.nextLine();
        try {
            file = new File(in.nextLine());
            System.out.println();
        } catch (NullPointerException n) {
            System.err.println("Такого файла не существует");
            return false;
        }
        FileInputStream fis = new FileInputStream(line + ".txt");
        BufferedWriter bufferWriter = new BufferedWriter(new FileWriter(line + ".txt", true));
        InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
        BufferedReader reader = new BufferedReader(isr);
        String strInfo;
        while ((strInfo = reader.readLine()) != null) {
            String[] arrInfo = strInfo.split(" ");
            res.add(new Person(arrInfo[0], arrInfo[1], arrInfo[2], arrInfo[3]));
            if(lineToRemove.equals(strInfo)){
                res.remove(); //???
                bufferWriter.newLine();
                bufferWriter.write(inLine);
                bufferWriter.flush();
            }
        }
        fis.close();
        reader.close();
        bufferWriter.close();
        return true;
    }
Answer 1
import java.io.Serializable;
import java.util.Objects;
import java.util.TreeSet;
class Person implements Serializable, Comparable<Person> {
TreeSet<Person> myPersonArrayList = new TreeSet<>();
private static int countId = 0;
public String name;
public String surname;
public String secondName;
public String age;
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return age.equals(person.age) &&
            Objects.equals(name, person.name) &&
            surname.equals(person.surname) && secondName.equals(person.secondName);
}
public Person(String Name,String Surname,String SecondName,String age){
    this.name = Name;
    this.surname = Surname;
    this.secondName = SecondName;
    this.age = age;
}
public void SetName(String Name){
    this.name = Name;
}
public void SetSurname(String Surname){
    this.surname = Surname;
}
public void SetSecondName(String SecondName){
    this.secondName = SecondName;
}
public void SetAge(String age) {
    this.age = age;
}
public String GetName(){
    return this.name;
}
public String GetSurname(){
    return this.surname;
}
public String GetSecondName(){
    return this.secondName;
}
public String GetAge(){
    return this.age;
}

public String toString() {
    return "\n " + name +
            "\n " + surname +
            "\n " + secondName +
            "\n " + age + "\n";
}

public int compareTo(Person o) {
//используем метод compareTo из класса String для сравнения имен
    int result = this.surname.compareTo(o.surname); // Здесь указать 
name/surname/second/date
//если имена одинаковые -  сравниваем возраст, используя метод compareTo из класса Integer
    if (result == 0) {
        result = this.age.compareTo(o.age);
    }
    return result;
}
public static Person parse(String string) {
    String[] parts = string.split(" ");
    if(parts.length != 4) {
        throw new IllegalArgumentException("Всего элементов в строке должно быть 4!");
    }
    if(!isDate(parts[3])) {
        throw new IllegalArgumentException("Дата записана неверно!");
    }
    return new Person(parts[0], parts[1], parts[2], parts[3]);
}
public static boolean isDate(String date) {
    return date.length() == 2 + 1 + 2 + 1 + 4 &&
            isNumber(date.substring(0, 2)) &&
            date.charAt(2) == '.' &&
            isNumber(date.substring(3, 5)) &&
            date.charAt(5) == '.' &&
            isNumber(date.substring(6, 10));
}
private static boolean isNumber(String string) {
    for(char ch : string.toCharArray()) {
        if(!isNumber(ch)) {
            return false;
        }
    }
    return true;
}
private static boolean isNumber(char ch) {
    return ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' ||
            ch == '5' || ch == '6' || ch == '7' || ch == '8' || ch == '9';
}
}

Тест

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Solution {
public static void main(String[] args){
    // Возьмите ваши данные из файла и поместите в массив по аналогии
    ArrayList<Person> list = new ArrayList<>();
    list.add(new Person("A", "B", "Romanovich", "02.01.2006"));
    list.add(new Person("C", "A", "Dmitrievich", "02.05.2005"));
    list.add(new Person("B", "C", "Petrovich", "12.11.2001"));
    // Можете добавить многопоточность, чтобы всегда была возможность читать команды с консоли
    if(new Scanner(System.in).nextLine().equals("sort")){
        Collections.sort(list);
        for (Person u : list) {
            System.out.println(u);
        }
    }
}
}

Дальше думаю справитесь сами =)

READ ALSO
Логика действий постинкрементов

Логика действий постинкрементов

Помогите разобраться в логике действийЧто левый оперант всегда сохраняется отдельно и потом возвращается более менее осознал в некоторых...

77
валидация формы, накопление ошибок

валидация формы, накопление ошибок

пытаюсь в массиве вывести все ошибки которые были допущены, но в нем оказывается только одна, остальные выводит

100