首页 > 解决方案 > 根据输入列表中的原始排序合并 2 个列表 - JAVA

问题描述

我有以下功能:

List<Pair<SomeObject, Integer>> process(List<SomeObject> input) {
   List<Pair<SomeObject, Integer>> result = new ArrayList<>();
   List<SomeObject> couldBeProcessed = new ArrayList<>();

   for (SomeObject obj : input) {
      if (couldBeProcessed(obj)) {
         couldBeProcessed.add(obj);
      } else {
         result.add(Pair.of(obj, 0));
      }
   }

   List<Pair<SomeObject, Integer>> processResult = processInBatch(couldBeProcessed); 
   // TODO: merge processResult with result here
}

如何将其添加processResultresults但保留在 中给我的顺序input

标签: javadictionaryfor-looparraylistjava-8

解决方案


如何使用地图来保存索引,然后使用 'ol for 循环:

List<Pair<SomeObject, Integer>> process(List<SomeObject> input) {
   List<Pair<SomeObject, Integer>> result = new ArrayList<>();
   Map<Integer, Pair<SomeObject, Integer>> map = new HashMap();
   List<SomeObject> couldBeProcessed = new ArrayList<>();

   for (int i = 0; i < input.size(); i++) {
      if (couldBeProcessed(input.get(i))) {
         couldBeProcessed.add(obj);
      } else {
         map.put(i, Pair.newInstance(obj, 0));
      }
   }

   List<Pair<SomeObject, Integer>> processResult = processInBatch(couldBeProcessed); 

   for (int i = 0; i < input.size(); i++) {
      if (map.containsKey(i)) {
         result.add(map.get(i));
      } else {
         result.add(processResult.remove(0));
      }
   }
}

您还可以使用Map#computeIfAbsent使第二个循环更紧凑:

for (int i = 0; i < input.size(); i++) {
    result.add(map.computeIfAbsent(i, index -> processResult.remove(0));
}

PS: 的元素processResult必须与原始列表中的各个对象具有相同的索引。

@Misha 建议使用一种更自然的方式来处理已处理的队列 - 通过使用Deque

Deque<Pair<SomeObject, Integer>> processResult = new ArrayDeque(processInBatch(couldBeProcessed)); 

for (int i = 0; i < input.size(); i++) {
    if (map.containsKey(i)) {
        result.add(map.get(i));
    } else {
        result.add(processResult.removeFirst());
    }
}

推荐阅读