在Java编程中,集合框架是我们处理数据的利器。今天我们将通过两个实用的案例——单词统计器和数据去重排序器,来深入探索HashMap和HashSet的强大功能。
单词统计器是一个能够分析文本中单词出现频率的工具,在自然语言处理、文本分析和数据挖掘等领域有着广泛的应用。通过这个案例,我们将学习如何使用HashMap来高效地统计和管理键值对数据。
public class WordCounter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一段文本:");
String text = scanner.nextLine();
// 使用HashMap统计单词出现次数
HashMap<String, Integer> wordCount = new HashMap<>();
// 分割文本为单词(按空格和标点符号分割)
String[] words = text.split("[\\s\\p{Punct}]+");
for (String word : words) {
if (!word.isEmpty()) {
String lowerWord = word.toLowerCase(); // 不区分大小写
wordCount.put(lowerWord, wordCount.getOrDefault(lowerWord, 0) + 1);
}
}
// 输出统计结果
System.out.println("\n单词统计结果:");
for (Map.Entry<String, Integer> entry : wordCount.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
String[] words = text.split("[\\s\\p{Punct}]+");
wordCount.put(lowerWord, wordCount.getOrDefault(lowerWord, 0) + 1);
传统方式对比:
// 传统方式
if (wordCount.containsKey(lowerWord)) {
wordCount.put(lowerWord, wordCount.get(lowerWord) + 1);
} else {
wordCount.put(lowerWord, 1);
}
// 现代方式(推荐)
wordCount.put(lowerWord, wordCount.getOrDefault(lowerWord, 0) + 1);
通过toLowerCase()方法实现大小写不敏感的统计,确保"Hello"和"hello"被识别为同一个单词。
请输入一段文本:
Hello world! Hello Java. Java is great, world is beautiful.
单词统计结果:
hello: 2
world: 2
java: 2
is: 2
great: 1
beautiful: 1
1.初始容量设置:如果知道大致单词数量,可以设置初始容量提高性能
HashMap<String, Integer> wordCount = new HashMap<>(expectedSize);
2.并行处理:对于大文本,可以使用并行流加速处理
Arrays.stream(words)
.parallel()
.forEach(word -> {
// 统计逻辑
});
数据去重和排序是数据处理中的常见需求。这个案例展示了如何使用HashSet快速去重,并结合TreeSet或Collections.sort()实现排序功能。
public class DeduplicationAndSorting {
public static void main(String[] args) {
// 创建包含重复元素的整数列表
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(
5, 2, 8, 2, 1, 9, 5, 3, 7, 1, 4, 6, 8, 3
));
System.out.println("原始列表: " + numbers);
// 使用HashSet去重
HashSet<Integer> uniqueNumbers = new HashSet<>(numbers);
System.out.println("去重后: " + uniqueNumbers);
// 使用TreeSet排序(自动排序)
TreeSet<Integer> sortedNumbers = new TreeSet<>(uniqueNumbers);
System.out.println("排序后: " + sortedNumbers);
// 或者使用Collections.sort()方法
ArrayList<Integer> sortedList = new ArrayList<>(uniqueNumbers);
Collections.sort(sortedList);
System.out.println("使用Collections.sort()排序: " + sortedList);
}
}
class Student {
private String id;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(id, student.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
// 降序排序
TreeSet<Integer> descendingSet = new TreeSet<>(Collections.reverseOrder());
descendingSet.addAll(uniqueNumbers);
// 自定义对象排序
TreeSet<Student> studentSet = new TreeSet<>(
Comparator.comparing(Student::getName)
.thenComparing(Student::getAge)
);
|
需求 |
推荐集合 |
理由 |
|
快速查找 |
HashMap/HashSet |
O(1)时间复杂度 |
|
保持插入顺序 |
LinkedHashMap/LinkedHashSet |
维护插入顺序 |
|
自动排序 |
TreeMap/TreeSet |
红黑树实现自动排序 |
|
线程安全 |
ConcurrentHashMap/Collections.synchronizedSet |
多线程环境使用 |
|
操作 |
ArrayList |
HashSet |
TreeSet |
|
添加 |
O(1) |
O(1) |
O(log n) |
|
查找 |
O(n) |
O(1) |
O(log n) |
|
删除 |
O(n) |
O(1) |
O(log n) |
|
排序 |
O(n log n) |
不支持 |
自动排序 |