0

そう、

整数のリストを使用して、さまざまなソースからデータを取得する状況があります。その結果、2 つのリストを取得します。どちらもコンテンツと同じ POJO タイプを持ち、入力リストのすべての要素を正確に含んでいますが、順序は不明です。

私が必要とするのは、これらの POJO を最初のリストと同じ順序でソートすることです (この整数は、POJO の getter/setter を持つフィールドです)。したがって、整数リストとまったく同じ順序で POJO を含むリストを取得します。

したがって、私が考えている手順は次のとおりです。

  1. 2 つの POJO リストを 1 つに結合すると、少なくとも 2 つの同じサイズのリスト (Integer と POJO) があり、一致する要素が含まれていることがわかっています。
  2. 結果の POJO リストを並べ替えて、整数リストと一致させます。

ただし、ステップ2では、それを行うための良い(つまり、効率的できちんとした)方法を見つける必要があります...次のようなコンパレーターを作成することを考えています:

public class POJOComparable implements Comparator<MyPOJO>{

  private List<Integer> values;

  public POJOComparable(List<Integer> values) {
    this.values = values;
  } 

  @Override
  public int compare(MyPOJO o1P, MyPOJO o2P) {
      int o1 = values.indexOf(o1P.getId());
      int o2 = values.indexOf(o2P.getId());
      return (o1>o2 ? -1 : (o1==o2 ? 0 : 1));
  }
} 

さて、これはそのようなソートを行うための良いアプローチですか、それともそれを行うためのより良いまたはより効率的な方法はありますか? リストは約 20 アイテムになりますが、この並べ替えは頻繁に実行されるため、効率的な方法を探しています。

4

4 に答える 4

4

の値を に保存List<MyPojo>TreeMap<Integer, MyPojo>、このコレクションにソートを任せます。これを実現する簡単な方法は次のとおりです。

TreeMap<Integer, MyPojo> aSortedMap = new TreeMap<Integer, MyPojo>();
for(MyPojo pojo : aListOfMyPojo) {
    aSortedMap.put(values.indexOf(pojo.getId()), pojo);
}

このアプローチでは、 everypojo.getId()の内部に一意の値が 1 つあると仮定していることに注意してくださいList<Integer> values


@BoristheSpider のコメントに基づいて、を使用してList<Integer> values各値をシークするのではなく、 の値と目的の値を保存する場所を使用して、検索プロセスを高速化することをお勧めします。したがって、結果のアルゴリズムは次のようになります。pojo.getId()List#indexOfMap<Integer, Integer>pojo.getId()Integer

//replace the List<Integer> by a Map<Integer>
Map<Integer, Integer> values = new HashMap<Integer, Integer>();
//store the pojo.getId() value with its associated int value
values.put(pojo.getId(), ...);

//...
TreeMap<Integer, MyPojo> aSortedMap = new TreeMap<Integer, MyPojo>();
for(MyPojo pojo : aListOfMyPojo) {
    aSortedMap.put(values.get(pojo.getId()), pojo);
}
于 2013-08-05T14:27:16.813 に答える
1

ソートは高価で、時間がかかりますO(nlgn)。a を使用しMapて s を id でマップし、から順Pojoに取得します。これは少し多くのメモリを必要としますが、より速くなるはずです:MapList

    final Map<Integer, Pojo> pojoMap = new HashMap<>(pojos.size(), 1f);
    for (final Pojo pojo : pojos) {
        pojoMap.put(pojo.id, pojo);
    }

    final List<Pojo> sortedPojos = new ArrayList<>(ids.size());
    for (final int id : ids) {
        sortedPojos.add(pojoMap.get(id));
    }

そう

  1. s をループし、プロパティによってPojoを作成しMapます。
  2. 元のファイルをループし、Listで を検索して新しいListを作成しPojoますMap
于 2013-08-05T14:30:56.307 に答える
1

POJO クラスを変更して、インデックスを int として含めます。一度に数十個のオブジェクトしかない場合、無駄なスペースは些細なものです。利点は、単純さ、直接性、および混乱のリスクの軽減です。

Comparator は、各オブジェクトのフィールドを調べるだけです。コストのかかるリスト検索は必要ありません。

于 2013-08-05T14:55:53.453 に答える
0

分割して征服し、最初に両方のリストを個別にソートしてからマージし、反復するたびに両方のリストの最初の要素を比較します (コンパレーターを使用)。これが最も効率的な方法です。

デフォルトの Java ソートを使用して、両方のリストをソートできます。

于 2013-08-05T14:24:17.600 に答える