如何依据另一数组的顺序对对象集合进行排序
按指定顺序整理SkuGroup集合的实现方法
这问题我之前处理过类似场景,核心思路就是先建立一个快速查找的映射表,再按指定顺序取出对应对象就行,具体步骤和代码如下:
步骤1:构建快速查找的映射(HashMap)
首先遍历无序的Set<SkuGroup>,把每个SkuGroup的sortkey作为键,对象本身作为值存入HashMap。这样后续查找对应对象的时间复杂度是O(1),比每次遍历集合查找高效得多。
// 构建sortkey到SkuGroup的映射 Map<String, SkuGroup> sortKeyMap = new HashMap<>(); for (SkuGroup skuGroup : unsortedSet) { // 注意:如果Set中有多个sortkey相同的SkuGroup,后面的会覆盖前面的 sortKeyMap.put(skuGroup.getSortkey(), skuGroup); }
步骤2:按指定顺序生成有序集合/数组
接下来遍历sortedkeys列表,依次从映射表中取出对应的SkuGroup,添加到新的集合中。这里可以根据需求处理sortedkeys中不存在对应SkuGroup的情况(比如跳过、存入null或者抛出异常)。
// 生成有序的List List<SkuGroup> sortedSkuGroups = new ArrayList<>(sortedkeys.size()); for (String key : sortedkeys) { SkuGroup targetGroup = sortKeyMap.get(key); if (targetGroup != null) { sortedSkuGroups.add(targetGroup); } else { // 可选处理方式1:抛出异常,提示找不到对应key throw new IllegalArgumentException("未找到对应sortkey为[" + key + "]的SkuGroup对象"); // 可选处理方式2:跳过该key // continue; // 可选处理方式3:存入null占位 // sortedSkuGroups.add(null); } } // 如果需要转换成数组,可以用下面的代码 SkuGroup[] sortedArray = sortedSkuGroups.toArray(new SkuGroup[0]);
补充说明
- 时间复杂度:这种方法的时间复杂度是O(n + m),其中n是
sortedkeys的长度,m是unsortedSet的大小,比直接嵌套遍历的O(n*m)高效很多,数据量越大优势越明显。 - 重复sortkey问题:如果
unsortedSet中存在多个sortkey相同的SkuGroup,HashMap会保留最后一个遍历到的对象,如果你需要处理这种重复场景,可以考虑用Map<String, List<SkuGroup>>来存储多个对象。
内容的提问来源于stack exchange,提问作者draca
相关产品推荐
相关产品推荐

