1

タイプのリストがありList<Element<Integer, Integer>>、各要素には2つの整数が含まれています。1つはentityIdで、もう1つはそのエンティティの優先度です。Integer[]次に、オブジェクト内の各エンティティに設定された優先順位に従って並べ替えられたentityIdの配列を作成する必要がありElementます。

リストのイテレータにのみアクセスできます。entityIdsのそのような優先順位でソートされた配列を作成するための最良の方法は何ですか?


私の考え:

イテレータを使用して最初に要素の配列を作成し、優先順位を使用して要素を並べ替え、Arrays.sort()次に整数の新しい配列を作成し、並べ替えられた配列からentityIdsをコピーします。これは良い考えですか?または、これよりも優れた代替手段はありますか?

4

3 に答える 3

2

優先度を調べるコンパレータを使用して、リストをPriorityQueueに入れます。次に、優先キューを繰り返し処理して、アレイを収集します。

テストされていないコードが続きます。タイプミスはお気軽に修正してください。

Integer[] getSortedEntityIds(Iterator<Element<Integer, Integer>> iter) {
  Comparator<Element<Integer,Integer>> comp = new Comparator<Element<Integer, Integer>>() {
    @Override
    public int compare(Element<Integer,Integer> ela, Element<Integer,Integer> elb) {
      return ela.getPriority().compareTo(elb.getPriority());
    }
  };

  PriorityQueue<Element<Integer,Integer>>pq = new PriorityQueue<Element<Integer,Integer>>(256, comp);
  // If you had the access to the whole list, you wouldn't have to iterate, you could just pass it into the pq constructor
  while(iter.hasNext() {
    pq.add(iter.next());
  }

  Integer[] sortedEntityIds = new Integer[pq.size()]

  for(int i = 0; i < pq.size(), i++) {
    Element<Integer, Integer>el = pq.remove();
    sortedEntityIds[i] = el.getEntityId();
  }

  return sortedEntityIds;
}
于 2012-04-26T04:48:54.037 に答える
0
  1. 2番目のリストを作成します。
  2. 元のリストから次のアイテムを取得します。
  3. 2番目のリストを繰り返し処理し、優先度の高い最初のアイテムを見つけます。
  4. その前に現在のアイテムを挿入します。
  5. 後藤2または終了。
于 2012-04-26T04:47:39.603 に答える
0

カスタムコンパレータを使用して、適切と思われる方法でリスト要素を並べ替えることができます。

final List<Element<Integer, Integer>> list = new ArrayList<Element<Integer, Integer>>();
list.add(new Element<Integer, Integer>(1, 1));
list.add(new Element<Integer, Integer>(4, 4));
list.add(new Element<Integer, Integer>(3, 3));
list.add(new Element<Integer, Integer>(2, 2));
list.add(new Element<Integer, Integer>(5, 5));

Collections.sort(list, new Comparator<Element<Integer, Integer>>() {

    @Override
    public int compare(final Element<Integer, Integer> x,
            final Element<Integer, Integer> y) {
        return x.getPriority().compareTo(y.getPriority());
    }
});

// Prints elements in ascending order of priority
System.out.println(Arrays.toString(list.toArray()));
于 2012-04-26T04:54:57.147 に答える