java之Collection
List:
Set:
HashSet
JDK8以后,当链表长度超过83,而且数组长度大于等于64时,自动转换为红黑树 必须同时满足
LinkedHashSet:
TreeSet:
如何在 Java 中实现排序(简单易懂版)
排序是我们在编程中经常需要实现的功能,无论是对数字、字符串,还是自定义对象进行排序,Java 都提供了非常强大的工具。今天,我们来一起学习如何用最简单的方式实现排序!
数组的排序方式
对于数组,Java 提供了 Arrays.sort
方法进行排序:
-
基本类型数组排序:
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] arr = {5, 2, 8, 1}; System.out.println("Before sorting: " + Arrays.toString(arr)); Arrays.sort(arr); // 默认升序排序 System.out.println("After sorting: " + Arrays.toString(arr)); } }
-
对象数组排序(需要实现
Comparable
或提供Comparator
):import java.util.Arrays; import java.util.Comparator; class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + " (" + age + ")"; } } public class Main { public static void main(String[] args) { Person[] persons = { new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35) }; // 按年龄升序排序 Arrays.sort(persons, Comparator.comparingInt(p -> p.age)); System.out.println("After sorting: " + Arrays.toString(persons)); } }
以上方法使用了提供Comparator方法。如果对于一个自定义对象根据情况不同,存在不同的排序方式,选择提供Comparator方法。如果排序规则是一定的,那么就实现Compareable接口
列表的排序
以ArrayList为例子。注意ArrayList当中还存在list.sort 的静态方法
package collection.ArrayListTest;
import java.util.ArrayList;
import java.util.Comparator;
public class ArrayStudentTest {
public static void main(String[] args) {
ArrayList <ArrayStudent> list = new ArrayList<>();
//创建学生对象
ArrayStudent s1 = new ArrayStudent("ZhangSan",50);
ArrayStudent s2 = new ArrayStudent("LiSi",16);
ArrayStudent s3 = new ArrayStudent("LiYuPing",23);
list.add(s1);//加入的是地址值,而不是对象本身
list.add(s2);
list.add(s3);
list.sort(((o1, o2) -> o1.getAge()-o2.getAge()));
// list.sort((Comparator.comparingInt(ArrayStudent::getAge)));
for (ArrayStudent a : list) {
System.out.println(a.getAge()+" "+a.getName());
}
}
}
1. 对普通列表排序
场景:假设有一个整数列表 ArrayList
,我们想将它从小到大排序。
代码:
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(2);
list.add(8);
list.add(1);
System.out.println("Before sorting: " + list);
Collections.sort(list); // 默认升序排序
System.out.println("After sorting: " + list);
}
}
运行结果:
Before sorting: [5, 2, 8, 1]
After sorting: [1, 2, 5, 8]
2. 对字符串排序
场景:我们有一个字符串列表,想按字母顺序排列。
代码:
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("banana");
list.add("apple");
list.add("cherry");
System.out.println("Before sorting: " + list);
Collections.sort(list); // 默认按字母升序
System.out.println("After sorting: " + list);
}
}
运行结果:
Before sorting: [banana, apple, cherry]
After sorting: [apple, banana, cherry]
3. 对自定义对象排序
场景:我们有一个 Person
类,想按照年龄对一组人进行排序。
方法 1:实现 Comparable
接口(自然排序)
代码:
import java.util.ArrayList;
import java.util.Collections;
class Person implements Comparable<Person> {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return this.age - other.age; // 按年龄升序
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("Alice", 30));
list.add(new Person("Bob", 25));
list.add(new Person("Charlie", 35));
System.out.println("Before sorting: " + list);
Collections.sort(list); // 使用自然排序
System.out.println("After sorting: " + list);
}
}
运行结果:
Before sorting: [Alice (30), Bob (25), Charlie (35)]
After sorting: [Bob (25), Alice (30), Charlie (35)]
方法 2:使用 Comparator
接口(自定义排序)
代码:
import java.util.ArrayList;
import java.util.Comparator;
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class Main {
public static void main(String[] args) {
ArrayList<ArrayStudent> listSort = new ArrayList<>();
listSort.add(new ArrayStudent("Alice", 30));
listSort.add(new ArrayStudent("Bob", 25));
listSort.add(new ArrayStudent("Charlie", 35));
// 按年龄升序序排序
Collections.sort(listSort,(o1,o2)->o1.getAge()- o2.getAge());
System.out.println("After sorting by age: " );
listSort.forEach(s-> System.out.println(s.getName()+":"+s.getAge()));
// 按年龄降序排序
listSort.sort((p1, p2) -> p2.getAge() - p1.getAge());
System.out.println("After sorting by age (descending): ");
listSort.forEach(s-> System.out.println(s.getName()+":"+s.getAge()));
}
运行结果:
Before sorting: [Alice (30), Bob (25), Charlie (35)]
After sorting by name: [Alice (30), Bob (25), Charlie (35)]
After sorting by age (descending): [Charlie (35), Alice (30), Bob (25)]
注意!!这两者不能记混了:
Comparator
是用于定义外部比较器的,它不应该直接由实体类实现,通常是创建一个单独的类或匿名类来定义比较规则。如果让实体类实现了 Comparator
,就会破坏逻辑结构,因为实体类变成了一个比较器,且多了与自身逻辑无关的职责 。所以注意实体类实现了Comparable接口
5. 小结
- 简单排序:
Collections.sort
或List.sort
是最常用的方法,适用于基本类型和String
。也就是输对于基本类型和String我们不需要在自定义排序规则。 - 自定义对象排序:
- 在对象的定义当中实现
Comparable
定义自然排序。 - 使用
Comparator
实现灵活的自定义排序。
- 在对象的定义当中实现
- 其他容器:
HashSet
和LinkedHashSet
需要转换为List
进行排序。TreeSet
和TreeMap
天然有序。HashMap
可以通过转换为条目列表实现排序。