掌握 Java 集合算法:排序、打乱、搜索与更多实用操作
Java 集合算法
Java 集合框架提供一组静态方法(称为通用算法),可操作实现 Collection 接口的任意集合,简洁高效。
1. Collections.sort() 排序
sort() 按自然顺序(升序)排列元素。自定义排序需提供 Comparator。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(4);
numbers.add(2);
numbers.add(3);
System.out.println("Unsorted ArrayList: " + numbers);
Collections.sort(numbers);
System.out.println("Sorted ArrayList: " + numbers);
}
}
输出
Unsorted ArrayList: [4, 2, 3] Sorted ArrayList: [2, 3, 4]
降序或特定规则可用自定义 Comparator,详见 Java 排序 指南。
2. Collections.shuffle() 打乱顺序
shuffle() 随机打乱元素顺序,适用于游戏或抽样场景。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("Sorted ArrayList: " + numbers);
Collections.shuffle(numbers);
System.out.println("ArrayList after shuffle: " + numbers);
}
}
输出
Sorted ArrayList: [1, 2, 3] ArrayList after shuffle: [2, 1, 3]
每次运行产生不同排列,基于 Fisher-Yates 算法。
3. 常规数据操作
Java 提供多种工具方法转换集合:
reverse()– 反转元素顺序fill()– 用指定值替换所有元素copy()– 复制元素到另一集合(需同等大小)swap()– 交换两个索引位置的元素addAll()– 将一集合所有元素追加到另一集合
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
System.out.println("ArrayList1: " + numbers);
Collections.reverse(numbers);
System.out.println("Reversed ArrayList1: " + numbers);
Collections.swap(numbers, 0, 1);
System.out.println("ArrayList1 after swap(): " + numbers);
ArrayList<Integer> newNumbers = new ArrayList<>();
newNumbers.addAll(numbers);
System.out.println("ArrayList2 using addAll(): " + newNumbers);
Collections.fill(numbers, 0);
System.out.println("ArrayList1 after fill(): " + numbers);
Collections.copy(newNumbers, numbers);
System.out.println("ArrayList2 after copy(): " + newNumbers);
}
}
输出
ArrayList1: [1, 2] Reversed ArrayList1: [2, 1] ArrayList1 after swap(): [1, 2] ArrayList2 using addAll(): [1, 2] ArrayList1 after fill(): [0, 0] ArrayList2 after copy(): [0, 0]
注意: copy() 要求目标集合至少与源集合大小相同。
4. Collections.binarySearch() 二分查找
在已排序集合中高效定位元素,返回索引或负的插入点。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
int pos = Collections.binarySearch(numbers, 3);
System.out.println("The position of 3 is " + pos);
}
}
输出
The position of 3 is 2.
提示: 调用 binarySearch() 前必须排序,否则结果未定义。详见 Java 二分查找。
5. 集合组合分析
分析集合间关系的工具方法:
frequency()– 统计特定元素出现次数disjoint()– 判断两集合是否无共同元素
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(2);
System.out.println("ArrayList1: " + numbers);
int count = Collections.frequency(numbers, 2);
System.out.println("Count of 2: " + count);
ArrayList<Integer> newNumbers = new ArrayList<>();
newNumbers.add(5);
newNumbers.add(6);
System.out.println("ArrayList2: " + newNumbers);
boolean disjoint = Collections.disjoint(numbers, newNumbers);
System.out.println("Two lists are disjoint: " + disjoint);
}
}
输出
ArrayList1: [1, 2, 3, 2] Count of 2: 2 ArrayList2: [5, 6] Two lists are disjoint: true
6. 查找最小值与最大值
用 min() 和 max() 获取最小/最大元素,适用于分析和边界检查。
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
int min = Collections.min(numbers);
System.out.println("Minimum Element: " + min);
int max = Collections.max(numbers);
System.out.println("Maximum Element: " + max);
}
}
输出
Minimum Element: 1 Maximum Element: 3
java
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- Java break 语句:用法、时机与标签 break 详解
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- Java 生成随机数实战:Random 与 Math.random 详解