编码此代码的最佳方法是什么:
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));
}
答案 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)
使用sorted
或TreeMap
等问题是它在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
次调用而不是add
或forEach
。