如何同步排序多个ArrayList?以indexes列表为排序依据
同步排序多个并行ArrayList的解决方案
直接使用Collections.sort(indexes)只会单独排序indexes列表,无法同步调整另外两个列表的顺序,得换个思路利用Collections.sort实现同步排序,下面是两种可行方案:
方案一:将关联元素绑定为对象排序
- 先定义一个类,把三个列表中对应位置的元素封装成一个整体:
class Data { int index; String name; String upper; Data(int index, String name, String upper) { this.index = index; this.name = name; this.upper = upper; } }
- 将三个ArrayList的元素转换为Data对象列表:
ArrayList<Data> dataList = new ArrayList<>(); for (int i = 0; i < indexes.size(); i++) { dataList.add(new Data(indexes.get(i), names.get(i), upper.get(i))); }
- 使用
Collections.sort对Data列表按照index字段排序:
Collections.sort(dataList, (a, b) -> Integer.compare(a.index, b.index));
- 最后将排序后的Data列表拆分回原有的三个ArrayList:
indexes.clear(); names.clear(); upper.clear(); for (Data d : dataList) { indexes.add(d.index); names.add(d.name); upper.add(d.upper); }
方案二:通过排序原始索引实现同步调整
如果不想自定义类,可以借助原始索引的排序来实现:
- 创建一个存储原始位置索引的列表:
ArrayList<Integer> originalIndices = new ArrayList<>(); for (int i = 0; i < indexes.size(); i++) { originalIndices.add(i); }
- 使用
Collections.sort对原始索引列表排序,排序依据是indexes中对应位置的值:
Collections.sort(originalIndices, (a, b) -> Integer.compare(indexes.get(a), indexes.get(b)));
- 根据排序后的索引,重新构建三个列表:
ArrayList<Integer> sortedIndexes = new ArrayList<>(); ArrayList<String> sortedNames = new ArrayList<>(); ArrayList<String> sortedUpper = new ArrayList<>(); for (int idx : originalIndices) { sortedIndexes.add(indexes.get(idx)); sortedNames.add(names.get(idx)); sortedUpper.add(upper.get(idx)); } // 替换原列表 indexes = sortedIndexes; names = sortedNames; upper = sortedUpper;
内容的提问来源于stack exchange,提问作者Charles Mosndup
相关产品推荐
相关产品推荐

