1

我有一个 type 列表List<Element<Integer, Integer>>,其中每个元素包含两个整数,一个是 entityId,另一个是该实体的优先级。现在我需要创建一个Integer[]entityIds 数组,该数组已根据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. 从原始列表中获取下一项。
  3. 遍历第二个列表并找到具有更高优先级的第一个项目。
  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 回答