ArrayList序列化的顺序问题

3

我有两个JAVA类:

public class Persons implements Serializable{
    String name;
    String phone;

    ...
}

并且:

public class Diary implements Comparable{
    ArrayList<Persons> persons=new ArrayList();

    ...
}

我希望通过名称(按字母顺序)对我的ArrayList进行排序,但是由于我的ArrayList是Persons类,因此我不能使用Collections.sort(),否则会出现错误。如果我在Persons类中实现Comparable接口,由于我的ArrayList是保存在Object.dat中的,以后就无法读取了。


你可能无法读取它,因为你已经改变了类以至于修改了编译器生成的serialVersionUID属性。你应该总是自己定义它,而不是让编译器为你定义。 - JonK
1
但是你可以实现多个接口,这几乎就是它们的意义所在。 - Dan Temple
1
如果您不想更改您的Person类,您可以通过使用sort(List<T> list, Comparator<? super T> c)来创建比较器来对Arraylist进行排序。 - niiraj874u
如果你只有一个Person,我会把这个类叫做Person。如果你有多个人,我会把这个类叫做People - Peter Lawrey
我不认为让Dairy可比是有意义的。 - Peter Lawrey
3个回答

3

试一下这个

    Collections.sort(persons, new Comparator<Persons>() {
        @Override
        public int compare(Persons o1, Persons o2) {
            return o1.name.compareTo(o2.name);
        }});

0
如果你想要一个按人员排序的集合,我会这样做。
class Dairy {
    final SortedMap<String, Person> people = new TreeMap<String, Person>();

}

或者

class Dairy {
    final SortedSet<Person> people = new TreeSet<Person>(new MyNameComparator());

}

或者

class Dairy {
    final List<Person> people = new ArrayList<Person>();

    public void sortPeople() {
        Collections.sort(people, new MyNameComparartor());
    }
}

0

这里是针对您的问题的完整示例。请将以下代码保存在Test.java文件中并运行它。

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


class Person implements Serializable{

    private static final long serialVersionUID = 1L;

    String name  ;
    String phone ;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public Person(String name, String phone) {
        super();
        this.name = name;
        this.phone = phone;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", phone=" + phone + "]";
    }




}

class Diary {

    ArrayList<Person> list = new ArrayList<Person>();

    public ArrayList<Person> getList() {
        return list;
    }

    public void setList(ArrayList<Person> list) {
        this.list = list;
    }

    public Diary(ArrayList<Person> list) {
        super();
        this.list = list;
    }

}

public class Test
{
    public static void main(String[] args) {


        Person p1 = new Person("John","123");
        Person p2 = new Person("Aby","456");
        Person p3 = new Person("Debra","789");

        ArrayList<Person> list = new ArrayList<Person>();
        list.add(p1);
        list.add(p2);
        list.add(p3);

        Diary d = new Diary(list);

        Collections.sort(d.getList(), new Comparator<Person>(){
            public int compare(Person item1, Person item2){
                int compare = item1.getName().compareTo(item2.getName());
                return compare;
            }
        });

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

使用比较器对人员名单进行排序,而不需要修改您的人员类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接