#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); }
правильно. Убедитесь, что вы написали это правильно. и правильно передать входные данные.