
在许多场景下,我们可能拥有两个或多个长度相同且元素之间存在一对一对应关系的列表。例如,一个 arraylist<string> words 存储单词,另一个 arraylist<integer> frequency 存储这些单词的出现频率,其中 words.get(i) 对应的频率是 frequency.get(i)。
如果直接对 frequency 列表进行排序(例如,使用 Collections.sort(frequency, Collections.reverseOrder())),虽然 frequency 列表本身会按照期望的顺序排列,但 words 列表的顺序不会随之改变。这会导致 words 列表中的单词与 frequency 列表中排序后的频率值不再匹配,从而失去了原始的关联性。例如:
原始数据: words = ["the", "I", "false", "too"]frequency = [1, 10, 5, 7]
直接排序 frequency 后: frequency = [10, 7, 5, 1]words = ["the", "I", "false", "too"] (未变)
此时,words.get(0) ("the") 对应的频率变成了 frequency.get(0) (10),这与原始数据中 "the" 的频率是 1 的事实相悖。我们需要一种方法,在排序 frequency 的同时,也同步调整 words 的顺序。
解决此问题的核心思想是:不直接对数据列表进行排序,而是对列表的索引进行排序。通过创建一个表示原始索引的序列,并根据关联列表(如 frequency)中的值来比较这些索引,我们就能得到一个按期望顺序排列的索引序列。最后,利用这个排序后的索引序列去访问并构建新的数据列表。
Java 8的Stream API为实现这一策略提供了非常简洁和高效的方式。
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class LinkedArrayListSorting {
public static void main(String[] args) {
// 原始数据列表
ArrayList<String> words = new ArrayList<>(Arrays.asList("the", "I", "false", "too"));
ArrayList<Integer> frequency = new ArrayList<>(Arrays.asList(1, 10, 5, 7));
System.out.println("原始 words: " + words);
System.out.println("原始 frequency: " + frequency);
// 使用Java 8 Stream API进行基于频率的单词列表排序
List<String> sortedWords = IntStream.range(0, words.size()) // 1. 生成从0到列表大小-1的整数流(即索引流)
.boxed() // 2. 将原始int流转换为Integer对象流,以便使用Comparator
.sorted(Collections.reverseOrder(Comparator.comparing(frequency::get))) // 3. 核心排序逻辑
// Comparator.comparing(frequency::get) 创建一个比较器,根据每个索引对应的frequency值进行比较
// Collections.reverseOrder(...) 将排序顺序反转,实现降序排列(频率从高到低)
.map(words::get) // 4. 根据排序后的索引,从words列表中获取对应的单词
.collect(Collectors.toList()); // 5. 将结果收集到一个新的List中
System.out.println("排序后 words: " + sortedWords);
// 期望输出: [I, too, false, the]
}
}通过巧妙地利用Java 8 Stream API对列表索引进行排序,我们能够优雅且高效地解决根据一个关联列表的值来排序另一个列表的问题,同时确保数据之间的一致性。这种方法不仅代码简洁、可读性强,而且避免了直接操作原始列表可能引入的数据对应关系破坏的风险,是处理此类关联数据排序问题的推荐方案。
以上就是Java中基于关联列表对数据进行排序的技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号