关于java:基于对象属性的ArrayList排序

ArrayList sorting on the basis of object property

本问题已经有最佳答案,请猛点这里访问。

下面是Employee bean类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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());
        }
    }
}

现在我有一个问题是,我想根据员工阶级年龄属性对数组列表进行排序。所以请解释一下我如何分类。


在其他答案中建议的接口是一个选项。

但是,一般来说,我建议不要执行Comparable接口,因为等级没有一个未被遗忘的自然顺序。当然,没有自然的命令。

想象一下你想按照他们的年龄去解雇那些雇员。一次在上级,一次在下级。你怎么能这么做?现在想象一下你曾经想用他们的名字命名他们的年龄,一次用他们的字母顺序。如果不执行Comparator,你就不能这样做。这就是我在这里的建议:

你可以创造一种方法

1
2
3
4
5
6
7
8
9
10
11
private static Comparator<Employee> byAge()
{
    return new Comparator<Employee>()
    {
        @Override
        public int compare(Employee o1, Employee o2)
        {
            return o1.getAge() - o2.getAge();
        }
    };        
}

然后你可以简单地呼唤

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

如果你想反复排列他们,你可以打电话给他们。

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

如果你想用他们的名字命名他们,你可以创建一个方法

1
2
3
4
5
6
7
8
9
10
11
private static Comparator<Employee> byName()
{
    return new Comparator<Employee>()
    {
        @Override
        public int compare(Employee o1, Employee o2)
        {
            return o1.getName().compareTo(o2.getName());
        }
    };        
}

与他们一起

1
    Collections.sort(empList, byName());

这是比执行Comparable更多元化的。


你可以使用收藏品,采用一种自定义比较法:

1
2
3
4
5
6
7
8
9
10
 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 Answer。


你需要写一个比较器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
    }
}

这样的方法。

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

希望你能帮忙。


植入Comparable接口

1
class Employee implements Comparable<Employee> {

Employee中添加compareTo方法

ZZU1

然后你就可以像这里一样

1
Collections.sort(empList)

这是一个简单的输出算法。我们保存下一个下载的价值,所以我们可以交换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
        }

我想你可能想在不同的性能上抽签,所以在这种情况下,你应该创建一个适当的比较器,并使用同一种方法(同一种方法)。


你的类别需要实现可比接口和EDOCX1[…]方法。然后你可以使用EDOCX1