collections.sort()

本文介绍如何使用Java中的Collections.sort()方法对包含自定义对象的列表进行排序,并通过具体示例展示了如何实现Comparator接口来定制排序规则。

collections.sort();简单用法

在做集合的一些操作的时候,排序那是必不可少的,各种各样的排序多不胜数,一般我们在集合里面放的都是基本数据类型,这样的排序号做,但是在处理集合里面放置对象的时候,把对象排序这个就有点问题了,不过没关系,没有解决不了的问题,只有想不到的问题。这就用到了collections.sort()方法。

例子:两个对象根据ID排序,大的在后,小的在前。

Sutdent.java

公共类Student {
 private int id;
 私人字符串名称;
 public int getId(){
  return id;
 }
 public void setId(int id){
  this.id = id;
 }
 public String getName(){
  return name;
 }
 public void setName(String name){
  this.name = name;
 }
}

主类

//创建对象ST1并赋值

学生st1 =新生();
  st1.setId(1);
  st1.setName( “WO1”);

//创建对象ST2并赋值

  学生st2 =新生();
  st2.setId(2);
  st2.setName( “WO2”);

//把两个对象添加到数组里面
  列表li = new ArrayList();
  li.add(ST2);
  li.add(ST1);

//遍历li数组
  Iterator it = li.iterator();
  while(it.hasNext())
  {
   Student stu =(Student)it.next();
   的System.out.println(stu.getId());
  }

//调用方法,完成排序,这里建MyComper类
  Collections.sort(li,new MyComper());
  的System.out.println( “排序后:”);
  Iterator it2 = li.iterator();
  while(it2.hasNext())
  {
   Student stu =(Student)it2.next();
   的System.out.println(stu.getId());
   }

MyComper.java

//实现比较接口,重写比较方法为1时,换位置

公共类MyComper实现比较器{

 @Override
 public int compare(Student o1,Student o2){
  // TODO自动生成的方法存根
  int stu1 = o1.getId();
  int stu2 = o2.getId();
  如果(stu1> stu2)
  {
   return 1;
  } else
  {
   return 0;
  }
  
 }

}

运行主函数类,输出结果:

2

1

排序后:

1

2

### 使用方法 `Collections.sort` 是 Java 集合框架中用于对列表进行排序的静态方法,它位于 `java.util.Collections` 类中。`Collections.sort` 有两种重载形式: #### 1. 对实现了 `Comparable` 接口的元素列表进行排序 如果列表中的元素实现了 `Comparable` 接口,`Collections.sort` 可以直接对列表进行自然排序。示例代码如下: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SortComparableExample { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); numbers.add(5); numbers.add(2); numbers.add(8); numbers.add(1); // 对列表进行排序 Collections.sort(numbers); // 输出排序后的列表 for (Integer num : numbers) { System.out.println(num); } } } ``` 在上述代码中,`Integer` 类实现了 `Comparable` 接口,因此可以直接使用 `Collections.sort` 对 `numbers` 列表进行排序。 #### 2. 使用自定义的 `Comparator` 进行排序 如果列表中的元素没有实现 `Comparable` 接口,或者需要使用非自然排序规则,可以使用 `Collections.sort` 的另一个重载形式,传入一个 `Comparator` 对象。示例代码如下: ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; class Person { private String name; private int age; public Person(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 "Person{name='" + name + "', age=" + age + "}"; } } public class SortWithComparatorExample { public static void main(String[] args) { List<Person> people = new ArrayList<>(); people.add(new Person("Alice", 25)); people.add(new Person("Bob", 20)); people.add(new Person("Charlie", 30)); // 使用自定义的 Comparator 按年龄排序 Comparator<Person> ageComparator = Comparator.comparingInt(Person::getAge); Collections.sort(people, ageComparator); // 输出排序后的列表 for (Person person : people) { System.out.println(person); } } } ``` 在上述代码中,`Person` 类没有实现 `Comparable` 接口,因此使用 `Comparator` 按年龄对 `people` 列表进行排序。 ### 原理 `Collections.sort` 方法的底层实现依赖于 `List` 的具体类型。对于 `ArrayList` 等基于数组实现的列表,`Collections.sort` 实际上调用了 `Arrays.sort` 方法。`Arrays.sort` 方法在 Java 7 及以后的版本中使用了 TimSort 算法。 TimSort 是一种结合了归并排序(Merge Sort)和插入排序(Insertion Sort)的混合排序算法,具有较好的性能。它的主要特点如下: - **自适应**:TimSort 会根据输入数据的特点自动调整排序策略。对于部分有序的数据,它可以利用数据的有序性减少比较和交换的次数。 - **稳定性**:TimSort 是一种稳定的排序算法,即相等元素的相对顺序在排序前后保持不变。 - **时间复杂度**:平均和最坏情况下的时间复杂度都是 $O(n log n)$,其中 $n$ 是列表的长度。 对于 `LinkedList` 等基于链表实现的列表,`Collections.sort` 会先将链表中的元素复制到一个数组中,然后使用 `Arrays.sort` 对数组进行排序,最后再将排序好的元素复制回链表中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值