基于对象属性的ArrayList排序

时间:2014-02-09 13:37:48

标签: java sorting collections

以下是Employee bean类。

public class Employee {
    public String name;
    public int age;

    public Employee()
    {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }
}

我有其他EmployeeTest类,在其中我创建了Employee类的对象并存储在ArrayList中。

import java.util.ArrayList;

public class EmployeeTest {
    public static void main(String[] args) 
    {
        ArrayList<Employee> empList = new ArrayList<Employee>();
        Employee emp1 = new Employee();
        emp1.setAge(15);
        emp1.setName("Employee1");
        Employee emp2 = new Employee();
        emp2.setAge(10);
        emp2.setName("Employee1");
        empList.add(emp1);
        empList.add(emp2);
        for(Employee emp : empList)
        {
            System.out.println("employee name : " + emp.getName());
            System.out.println("employee age : " + emp.getAge());
        }
    }
}

现在我有一个问题是我想根据Employee类的age属性对ArrayList进行排序。所以请解释我该如何排序。

7 个答案:

答案 0 :(得分:10)

让其实现Comparable接口,如其他答案所示,是一种选择。

但总的来说,我建议 NOT 实现Comparable接口,只要该类没有毫无疑问的自然顺序。对于Employee,肯定有 NO 自然排序

想象一下,您希望根据员工的年龄对员工进行排序。一旦按升序排列,一次按降序排列。你怎么能做到这一点?现在想象一下你想按照他们的年龄对它们进行一次排序,并按照字母顺序按照他们的名字排序。如果不实施Comparator,则无法执行此操作。这就是我在这里推荐的内容:

您可以创建类似

的方法
private static Comparator<Employee> byAge()
{
    return new Comparator<Employee>()
    {
        @Override
        public int compare(Employee o1, Employee o2)
        {
            return o1.getAge() - o2.getAge();
        }
    };        
}

然后你可以简单地调用

Collections.sort(empList, byAge());

如果要按相反顺序对它们进行排序,可以调用

Collections.sort(empList, Collections.reverseOrder(byAge()));

如果要按名称对它们进行排序,可以创建方法

private static Comparator<Employee> byName()
{
    return new Comparator<Employee>()
    {
        @Override
        public int compare(Employee o1, Employee o2)
        {
            return o1.getName().compareTo(o2.getName());
        }
    };        
}

对它们进行排序
    Collections.sort(empList, byName());

这比实施Comparable更加通用。

答案 1 :(得分:2)

您可以将Collections.sort方法与自定义Comparator

一起使用
 import java.util.Collections;
 import java.util.Comparator;

 [...]

 Collections.sort(empList, new Comparator<Employee>() {
                @Override public int compare(Employee x, Employee y) {
                   return Integer.compare(x.getAge(), y.getAge());
                }
            });

我使用了匿名Comparator课程,您也可以写一个普通的Comparator课程,请参阅Sri Harsha Chilakapati的答案。

答案 2 :(得分:1)

实施Comparable界面

class Employee implements Comparable<Employee> {   

compareTo类中添加方法Employee,如下所示:

 @Override
 public int compareTo(Employee other) {
     return this.age - other.age;
 }

然后你可以像这里一样对你的列表进行排序:

Collections.sort(empList)

答案 3 :(得分:1)

你需要写一个比较器。

class EmployeeAgeComparator implements Comparator<Employee>
{
    @Override
    public int compare(Employee e1, Employee e2)
    {
        if (e1.getAge() > e2.getAge())
        {
            return -1;
        } 
        else if (e1.getAge() < e2.getAge())
        {
            return 1;
        }
        return 0;
    }
}

然后使用Collections.sort这样的方法。

Collections.sort(empList, new EmployeeAgeComparator());

希望这有帮助。

答案 4 :(得分:0)

您的类必须实现Comparable接口并实现compareTo方法。然后,您可以使用Arrays.sort(yourArray)对其进行排序。

答案 5 :(得分:0)

我认为您可能希望对不同的属性进行排序,因此在这种情况下,您应该创建适当的比较器,并使用正确的排序方法(也需要它)。

答案 6 :(得分:0)

这是一种简单的排序算法。我们存储最低年龄的下标值,以便我们可以交换它。​​

for (int i = 0; i < empList.size(); i++)
        {
            int smallest = i;
            for (int j = i; j < numbers.length; j++)
            {
                if (empList.get(j).getAge() < emplist.get(smallest).getAge())
                    smallest = j;
            }

            int temp = empList.get(i).getAge();

            empList.set(i, empList.get(smallest))
            empList.set(smallest, temp);
        }