Java:如何获取对象列表的排序索引数组且避免大量对象创建?
解决方案
你可以直接操作索引数组来实现,完全不需要创建额外的包装对象,内存开销更小,代码也更简洁:
核心思路
- 先生成一个和原列表长度一致的索引数组,元素是
0到list.size()-1,对应原列表的每个元素位置 - 对这个索引数组排序,排序时的比较逻辑直接使用原列表中对应索引的元素进行比较
- 最后把排序后的索引数组转成
int[]返回
Java 代码示例
import java.util.Arrays; import java.util.Comparator; import java.util.List; public class SortedIndexGenerator { public static int[] getSortedIndices(List<? extends Comparable<?>> originalList) { int listSize = originalList.size(); // 初始化索引数组 Integer[] indices = new Integer[listSize]; for (int i = 0; i < listSize; i++) { indices[i] = i; } // 按原列表元素的顺序对索引数组排序 Arrays.sort(indices, (idx1, idx2) -> originalList.get(idx1).compareTo(originalList.get(idx2)) ); // 转成int[]返回 int[] result = new int[listSize]; for (int i = 0; i < listSize; i++) { result[i] = indices[i]; } return result; } public static void main(String[] args) { List<Integer> testList = List.of(50, 40, 30, 20, 10); int[] sortedIndices = getSortedIndices(testList); // 输出结果:[4, 3, 2, 1, 0] System.out.println(Arrays.toString(sortedIndices)); } }
优势说明
- 避免了创建百万级的自定义包装对象,仅需一个Integer数组(内存占用远低于自定义对象数组)
- 代码逻辑直观,直接围绕索引和原列表操作,不需要额外定义类
- 利用JDK标准库的排序实现,性能稳定可靠
内容的提问来源于stack exchange,提问作者bauerjlb
相关产品推荐
相关产品推荐

