2017-11-02 14 views
1

これをコード化する最良の方法は何ですか:リストを特定の順序で配列リストに変換する

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

「HashMap」の代わりに「TreeMap」を使用してみてください。 – Jesper

+1

あなたの 'ObjectType'クラスに' Comparable'インターフェースを実装し、 'HashMap'の代わりに' TreeMap'を使います。 –

+1

@SungJinSteveYoo Comparableを実装することは無用です:マップのキーは整数です。 –

答えて

6

あなたはTreeMap<Integer, RelatedModule>を使用することができ、しかし、そこに複数のオブジェクトが同じ順序であると意図が最後の1を維持するだけにしない限り、あなたは、単にあなたのリストをソートし、それを変換することができます:

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

sortedまたはTreeMapなどを使用して問題が発生したのは、O(n)時に計算できる時刻をO(n log n)で計算することです。あなたの場合は、既に注文を知っているので、ソートする必要はありません。これはorderプロパティによって決定されます。あなたは、新しいArrayListにに結果をコピーしたい場合があり

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

最速のソリューションは、このようなものです。

オリジナルのコードは最適な時間の複雑さを備えていますが、にはputまたはaddではなくcollectコールを使用することができます。

関連する問題