java集合的排序

来自:http://topic.youkuaiyun.com/u/20080728/13/9e8f80e0-4580-497a-8520-7b490f32a471.html

 

用Collections.sort方法对list排序有两种方法
第一种是list中的对象实现Comparable接口,如下:

/**
* 根据order对User排序
*/
public class User implements Comparable<User>{
    private String name;
    private Integer order;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getOrder() {
        return order;
    }
    public void setOrder(Integer order) {
        this.order = order;
    }
    public int compareTo(User arg0) {
        return this.getOrder().compareTo(arg0.getOrder());
    }
}

 

测试一下:

public class Test{

    public static void main(String[] args) {
        User user1 = new User();
        user1.setName("a");
        user1.setOrder(1);
        User user2 = new User();
        user2.setName("b");
        user2.setOrder(2);
        List<User> list = new ArrayList<User>();
        //此处add user2再add user1
        list.add(user2);
        list.add(user1);
        Collections.sort(list);
        for(User u : list){
            System.out.println(u.getName());
        }
    }
}

  

输出结果如下
a
b
第二种方法是根据Collections.sort重载方法来实现,例如:

/**
* 根据order对User排序
*/
public class User { //此处无需实现Comparable接口
    private String name;
    private Integer order;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getOrder() {
        return order;
    }
    public void setOrder(Integer order) {
        this.order = order;
    }
}

 

主类中这样写即可:

public class Test{
    public static void main(String[] args) {
        User user1 = new User();
        user1.setName("a");
        user1.setOrder(1);
        User user2 = new User();
        user2.setName("b");
        user2.setOrder(2);
        List<User> list = new ArrayList<User>();
        list.add(user2);
        list.add(user1);
       
        Collections.sort(list,new Comparator<User>(){
            public int compare(User arg0, User arg1) {
                return arg0.getOrder().compareTo(arg1.getOrder());
            }
        });
        for(User u : list){
            System.out.println(u.getName());
        }
    }
}

 
输出结果如下
a
b
前者代码结构简单,但是只能根据固定的属性排序,后者灵活,可以临时指定排序项,但是代码不够简洁

择优用之。

### Java 集合排序的方法与示例 在 Java 开发中,集合排序是非常常见的操作之一。以下是几种常用的集合排序方法及其具体实现。 #### 使用 `Collections.sort` 进行单字段升序排序 对于简单的列表对象,可以使用 `Collections.sort` 方法配合自定义比较器完成排序。以下是一个基于整数列表的简单例子: ```java import java.util.*; public class SortExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(5, 3, 8, 1); Collections.sort(numbers); // 默认按自然顺序排序 System.out.println("Sorted Numbers: " + numbers); } } ``` 上述代码展示了如何对一个整型列表进行默认的升序排序[^1]。 --- #### 使用 Comparator 接口进行自定义排序 如果需要按照特定规则(如降序或其他逻辑)对集合进行排序,则可以通过实现 `Comparator` 接口来自定义排序行为。下面的例子演示了如何对字符串列表按长度进行排序: ```java import java.util.*; public class CustomSortExample { public static void main(String[] args) { List<String> words = Arrays.asList("apple", "banana", "pear"); // 自定义比较器:按字符串长度排序 words.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } }); System.out.println("Words Sorted by Length: " + words); } } ``` 此代码片段实现了根据字符串长度从小到大排列的功能。 --- #### 利用 JDK 8 的 Lambda 表达式简化 Comparator 实现 从 Java 8 起,Lambda 表达式的引入使得编写简洁的比较器变得更加容易。以下是对用户对象按年龄字段进行升序排序的一个实例: ```java import java.util.*; import java.util.stream.Collectors; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "User{name='" + name + "', age=" + age + "}"; } } public class Jdk8SortExample { public static void main(String[] args) { List<User> users = Arrays.asList( new User("Alice", 30), new User("Bob", 25), new User("Charlie", 35) ); // 使用 Lambda 表达式按年龄升序排序 users.sort(Comparator.comparing(User::getAge)); System.out.println("Users Sorted by Age (Ascending): " + users); // 或者按姓名字母顺序降序排序 users.sort(Comparator.comparing(User::getName).reversed()); System.out.println("Users Sorted by Name (Descending): " + users); } } ``` 这段代码不仅展示了如何利用 Lambda 表达式简化比较器书写过程,还提供了两种不同的排序方式——分别针对用户的年龄和名字[^2]。 --- #### 多字段排序的最佳实践 当需要依据多个条件对集合中的元素进行排序时,可采用链式调用来组合不同维度上的比较结果。例如,在处理包含员工信息的数据集时,先按部门再按薪资高低排序可能是必要的业务需求。下面是相应的实现方案: ```java import java.util.*; import java.util.stream.Collectors; class Employee { private String department; private double salary; public Employee(String department, double salary) { this.department = department; this.salary = salary; } public String getDepartment() { return department; } public double getSalary() { return salary; } @Override public String toString() { return "Employee{department='" + department + "', salary=" + salary + '}'; } } public class MultiFieldSortExample { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee("HR", 50000), new Employee("Engineering", 75000), new Employee("HR", 60000), new Employee("Engineering", 90000) ); // 按部门名称升序,同部门内按薪水降序排序 employees.sort(Comparator.comparing(Employee::getDepartment) .thenComparingDouble(Employee::getSalary, Comparator.reverseOrder())); System.out.println("Employees Sorted by Department and Salary: " + employees); } } ``` 这里通过连贯调用 `.thenComparing()` 方法完成了复杂的多级排序任务[^4]。 --- ### 总结 以上介绍了四种主要的 Java 集合排序方法,分别是基础的 `Collections.sort`、灵活的 `Comparator` 定义、现代化的 Lambda 表达式支持以及高级别的多字段联合排序技巧。每种方法都有其适用场景,开发者应根据实际情况选择最合适的工具和技术手段来解决问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值