将List转换为具有特定顺序的ArrayList

时间:2017-11-02 07:12:58

标签: java lambda collections hashmap

编码此代码的最佳方法是什么:

objectsList不是空列表。包含许多对象。这只是为了说明这种类型。

    List<ObjectType> objectsList= Collections.EMPTY_LIST;

    ArrayList<RelatedModule> arrayWithOrder = new ArrayList<>();

    Map<Integer, RelatedModule> mappedObjects= new HashMap<>();

    objectsList.forEach(o ->
            mappedObjects.put(o.getOrder(),
                    new Dto(o.getFirstName(),
                            o.getLastName()))
    );

    for (int i = 0; i < objectsList.size(); i++) {
        arrayWithOrder.add(mappedObjects.get(i));
    }

2 个答案:

答案 0 :(得分:6)

你可以使用TreeMap<Integer, RelatedModule>,但是,除非有多个具有相同顺序的对象,并且意图只保留最后一个,你可以简单地对列表进行排序然后对其进行转换:

List<RelatedModule> arrayWithOrder = 
    objectsList.stream()
               .sorted(Comparator.comparingInt(ObjectType::getOrder))
               .map(o -> new RelatedModule(o.getFirstName(), o.getLastName()))
               .collect(Collectors.toList());

答案 1 :(得分:1)

使用sortedTreeMap等问题是它在O(n log n)时间计算可以在O(n)时间计算的内容。在您的情况下,您不需要排序,因为您已经知道订单 - 它由order属性决定。

最快的解决方案是这样的:

RelatedModule[] arrayWithOrder = new RelatedModule[objectsList.size()];
for (ObjectType o : objectsList)
    arrayWithOrder[o.getOrder()] = new Dto(o.getFirstName(), o.getLastName());

您可能希望将结果复制到新的ArrayList

您的原始代码具有最佳时间复杂度,但您可以进行的一项改进是在collect中使用put次调用而不是addforEach