如何对两个ArrayList按相同顺序排序?数字列表需升序排列
实现两个ArrayList的同步排序
你需要让numbers按升序排序,同时让linkers保持和numbers原本的元素配对关系,这里有两种实用的实现方式:
方法一:用自定义配对对象绑定元素
把数字和对应的字符串封装成一个对象,让它们始终关联,再对对象列表排序:
- 先定义一个简单的配对类:
class NumberLinkerPair { int number; String linker; public NumberLinkerPair(int number, String linker) { this.number = number; this.linker = linker; } }
- 将两个列表的元素配对,排序后重新填充原列表:
// 把数字和字符串一一配对 ArrayList<NumberLinkerPair> pairList = new ArrayList<>(); for (int i = 0; i < numbers.size(); i++) { pairList.add(new NumberLinkerPair(numbers.get(i), linkers.get(i))); } // 按数字升序排序配对列表 Collections.sort(pairList, (a, b) -> Integer.compare(a.number, b.number)); // 清空原列表,重新填入排序后的元素 numbers.clear(); linkers.clear(); for (NumberLinkerPair pair : pairList) { numbers.add(pair.number); linkers.add(pair.linker); }
方法二:通过排序索引实现同步
如果不想新建类,可以直接操作元素的索引,基于numbers的值排序索引,再按索引重新生成列表:
// 创建包含所有索引的列表 ArrayList<Integer> indices = new ArrayList<>(); for (int i = 0; i < numbers.size(); i++) { indices.add(i); } // 按照numbers中对应位置的数值,对索引排序 Collections.sort(indices, (a, b) -> Integer.compare(numbers.get(a), numbers.get(b))); // 根据排序后的索引,生成新的有序列表 ArrayList<Integer> sortedNumbers = new ArrayList<>(); ArrayList<String> sortedLinkers = new ArrayList<>(); for (int index : indices) { sortedNumbers.add(numbers.get(index)); sortedLinkers.add(linkers.get(index)); } // 替换原列表(如果不需要保留原数据,这步可以直接覆盖) numbers.clear(); numbers.addAll(sortedNumbers); linkers.clear(); linkers.addAll(sortedLinkers);
两种方法都能正确处理重复值(比如你例子里的两个0),保证配对关系不会错乱。
内容的提问来源于stack exchange,提问作者Deepesh Paul
相关产品推荐
相关产品推荐

