按字段递归排序对象的ArrayList

时间:2014-07-15 03:14:06

标签: java sorting recursion arraylist field

我有一个带有构造函数的Person

Person(String name, String position, int birthYear)
{
    this.name = name;
    this.position = position;
    this.birthYear = birthYear;
}

我还有一个Work类,其ArrayList<Person> personnel需要按birthYear递归排序。关于如何做到这一点我完全彻底失败了。通过赋值我需要的解决方案不能包含接口。我知道如何对整数数组进行排序,但我不确定如何处理涉及的对象的ArrayList。

5 个答案:

答案 0 :(得分:3)

确保您的班级Person实施Comparable。通过这样做,你必须实现方法:

int compareTo(Person o)

实施时,将this.birthYearo.birthYear进行比较,如果第一个大于,等于或小于后者,则返回1,0或-1。

完成此操作后,您可以使用Collections.sort(people)按birthYear对集合进行排序。

您还可以使用Person

comparator的集合进行排序
List<Person> people = new ArrayList<Person>();
// add a few "Person"s to the list...
Collections.sort(people, new Comparator<Person>() {
      public int compare(Person a1, Person a2) {
        return a1.getBirthYear() - a2.getBirthYear();
      }
    }); 

答案 1 :(得分:0)

您可以使用

Collections.sort(List<T> list, Comparator<? super T> c) 

它可以对任何类型T的列表进行排序,但是你需要传递一个比较器来为你的元素排序。

您也可以使用

Collections.sort(List<T> list) 

但是这假设列表中的元素是可比较的。即元素实现Comparable接口。要使此方法起作用,您应该正确实现Comparable接口的compareTo方法。

答案 2 :(得分:0)

我认为&#34;不能包含接口&#34;意味着Person不允许实现任何接口,而不是你根本不能使用接口(这听起来像一个荒谬的要求)。

最直接的解决方案是您排除的问题:您可以Person实施Comparable<Person>来定义&#34;自然&#34;排序Person个实例的顺序。然后,您可以将ArrayList传递给Collections.sort()并对其进行排序。

但是,如果您希望能够以多种方式对Person个实例进行排序,或者Person是您无法控制的课程,那么这显然不起作用(例如,您不能修改它以添加界面)。在这种情况下,您可以使用overload Collections.sort() Comparator<Person>。您需要定义一个实现Collections.sort()的类,并将该类的实例传递给{{1}}。

答案 3 :(得分:0)

首先,如果您遇到arraylists问题,以下Java文档可能会有所帮助。

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

所以你有一个Person对象的arraylist,名为staff。使用.get(int index)访问每个人对象。对于人员中的每个人物,.birthYear让您可以访问您正在寻找的生育年份。

更具体地说,你如何对它们进行排序?您通常可以使用collections类中的sort方法。请查看此处的文档:

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html

如果您想编写自己的排序算法(因为您不能包含接口),而不是使用提供的排序算法,您可以尝试通常的递归和nlogn时间快速排序和合并输入。这里详细说明了这些步骤:

http://en.wikipedia.org/wiki/Sorting_algorithm

答案 4 :(得分:0)

对包含整数的对象的递增递归排序示例,该整数不使用java内置的功能为您做繁重的工作:

    List<Person> recursiveSort(List<Person> personnel) {

    boolean changed = false;
    for (int i=0; i<personnel.size()-1; i++) { // Do not use for each format in recursive methods
        if (compare(personnel.get(i),personnel.get(i+1))>0) {
            changed = true;
            swap(personnel,i,i+1);
        }
    }

    if (changed) return sort(personnel); // Recursive call
    else return personnel;
}

int compare(Person p1, Person p2) {
    if (p1.birthYear < p2.birthYear) return -1;
    if (p2.birthYear < p1.birthYear) return 1;
    return 0;
}

void swap(List<Person> personnel, idx1, idx2) {
    try {
        Person swp = personnel.get(idx1);
        personnel.set(idx1, personnel.get(idx2));
        personnel.set(idx2, swp);
    catch (Exception e) {
        // Print warning
    }
}
  

我知道如何对整数数组进行排序,但我不确定如何处理涉及的对象的ArrayList。

对成员整数属性上的对象数组进行排序应该与对整数数组进行排序的算法完全相同,只是您需要访问整数属性值。一个例子是:

        Collections.sort(personnel,new Comparator() {

        @Override
        public int compare(Person p1, Person p2) {
            if (p1.birthYear < p2.birthYear) return -1;
            if (p2.birthYear < p1.birthYear) return 1;
            return 0;
        }

    });