Как я могу преобразовать список массивов в объект?

#java

#java

Вопрос:

Я должен отсортировать объект, который содержит имя / фамилию / дату / цену / оплачено по фамилиям в алфавитном порядке, но когда я сортирую объект с помощью Collection.отсортируйте и попробуйте переписать объект, там написано, что -java.util.ArrayList не может быть приведен к dip107.Student. Student — это имя объекта (класс Student реализует Serializable{).

 public Student(String name, String surname, String date, double price, double paid) {
    this.name = name;
    this.surname = surname;
    this.date = date;
    this.price = price;
    this.paid = paid;
}

public static void sortsurname() {
    List<String> sort  = new ArrayList<String>();

    try {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("temp"));
        Student s;
        boolean EOF = false;
        while (!EOF) {
            try {
                s = (Student) 
                in.readObject();
                sort.add(s.surname.toString());
                Collections.sort(sort);
                out.writeObject(sort);
            } catch (EOFException e) {
                EOF = true;
            }
        }
        in.close();
        out.close();
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
    new File(filename).delete();
    new File("temp").renameTo(new File(filename));
}
  

Комментарии:

1. ArrayList уже является объектом

2. s = (Student) in.readObject(); Скорее всего, вы читаете в объекте ArrayList, но ошибочно приводите его как объект Student. Вы не можете этого сделать.

3. Извините, новичок в программировании. Хорошо, тогда почему это не позволяет мне переписать исходный объект?

4. Исходный объект уже является ArrayList , и он позволяет вам его прочитать

5. ArrayList<Student> studentList = (ArrayList<Student>) in.readObject();

Ответ №1:

Вот рабочий код. Суть в том, что вы написали в файле, из которого вы читаете. Вы можете написать сортировку либо путем реализации интерфейса Comparable в Student, либо путем передачи компаратора в методе Collections.sort().

 import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SomeClass {


    public static void main(String args[])throws Exception{
        Student s1 = new Student("zksjdf","sdfkj");
        Student s2 = new Student("yui","aqws");
        List<Student> s = new ArrayList<>();
        s.add(s1);
        s.add(s2);
        ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream("out1.txt"));
        ObjectOutputStream out2 = new ObjectOutputStream(new FileOutputStream("out2.txt"));
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("out1.txt"));

        out1.writeObject(s); // line 27

        boolean EOF = false;
        while (!EOF) {
            try {
                List<Student> ss = (List<Student>) in.readObject(); // this cast depends on what you'r writing in the file on line 27
                Collections.sort(ss, new Comparator<Student>() {

                    @Override
                    public int compare(Student o1, Student o2) {
                        return o1.lastName.compareTo(o2.lastName);
                    }
                });
                System.out.println(ss);
                out2.writeObject(ss);

            } catch (EOFException e) {
                EOF = true;
            }
        }
        in.close();
        out1.close();
        out2.close();
    }

}


class Student implements Serializable{
    private static final long serialVersionUID = -6960348259392457529L;
    String lastName;
    String firstName;
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public Student(String lastName, String firstName) {
        super();
        this.lastName = lastName;
        this.firstName = firstName;
    }
    @Override
    public String toString() {
        return "{" lastName   ", "   firstName "}";
    }
}
  

Комментарии:

1. Спасибо за вашу помощь, но я не понимаю, почему вы добавляете Student s1 и s2. В моем случае я уже создал класс, который содержит имена всех учащихся.. . Приношу свои извинения за то, что задаю глупые вопросы 🙂

2. Это просто для иллюстрации моей точки зрения. Я хотел показать фактическое содержимое out1.txt файла. Поскольку файл содержит сериализованный список, мы вводим десериализованный объект в List<Student> , а не Student как вы делали в s = (Student)in.readObject();

3. Хорошо, я переписал код, и он работает, но он не сортируется. Возможно, ему не нравится: @Override public int compare(Student o1, Student o2) { возвращает o1.LastName.compareTo(o2.LastName); }

4. Нет, @Override public int compare(Student o1, Student o2) { return o1.lastName.compareTo(o2.lastName); } правильно. Убедитесь, что вы написали это правильно. и правильно передать входные данные.