优先级队列 - 连续的整数组

时间:2015-02-07 05:22:25

标签: java priority-queue

我正在研究这个问题: 将一个数字列表分成连续数字组,但应保留其原始顺序?  例如  输入:8,2,4,7,1,0,3,6  输出:2,4,1,0,3和8,7,6

我实施了一个解决方案,简单地说:

  1. 将原始数组存储到地图中,其中键是输入元素,值是原始数组中的索引。
  2. 对输入数组进行排序
  3. 遍历排序数组,并在数字连续时将每个元素添加到priorityqueue中。
  4. 但是PriorityQueue还有一些错误。例如,如果输入为{2,4,3},则PriorityQueue最终将为{2,3,4}。我尝试调试它,我发现我的实现与两个数字一起工作正常,但是当我添加第三个数字时,它只将自己与队列的头部进行比较,因此从未比较过3(原始索引2) 4(原始索引1)。因此,似乎添加到此队列的新Pair不会与其他所有元素进行比较。但这不应该发生,所以我不确定问题是什么,有人可以帮我看看我的代码吗?

    public class ConsecutiveGroupsofIntegers {
    
        public static void main(String[] args){
            List<Integer> input = Lists.newArrayList(2,4,3);
    
            List<PriorityQueue<Pair<Integer, Integer>>> groups = findGroups(input);
    
            for(PriorityQueue<Pair<Integer, Integer>> group : groups){
                for(Pair<Integer, Integer> pair : group){
                    System.out.print(pair.getKey() + ",");
                }
                System.out.println("============");
            }
    
        }
    
        public static List<PriorityQueue<Pair<Integer, Integer>>> findGroups(List<Integer> input){
    
            Map<Integer, Integer> map = new LinkedHashMap<>();
            for(int i = 0; i < input.size(); i++){
                map.put(input.get(i), i);
            }
    
            Collections.sort(input);
            List<PriorityQueue<Pair<Integer, Integer>>> groups = new ArrayList<>();
            PairComparator comparator = new PairComparator();
            PriorityQueue<Pair<Integer, Integer>> group = new PriorityQueue<>(input.size(),comparator);
            int first = input.get(0);
            group.add(new ImmutablePair<>(first, map.get(first)));
            for(int i = 1; i < input.size(); i++){
                int num = input.get(i);
                int index = map.get(num);
    
                if(input.get(i) - input.get(i-1) > 1){
                    groups.add(group);
                    group = new PriorityQueue<>(input.size(),comparator);
                }
                group.add(new ImmutablePair<>(num, index));
    
                if(i == input.size()-1){
                    groups.add(group);
                }
    
            }
    
            return groups;
        }
    
        public static class PairComparator implements Comparator<Pair<Integer, Integer>>{
    
            @Override
            public int compare(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) {
                return o1.getRight() - o2.getRight();
            }
        }
    
    }
    

2 个答案:

答案 0 :(得分:2)

除了打印方式外,您的代码看起来正确。 : - )

当您遍历优先级队列时,不要指望它按照您期望的顺序为您提供元素。如果您需要按顺序排列项目,则应该实际使用.peek(..).poll(..)方法。

来自Javadoc

  

这个类及其迭代器实现了所有可选方法   Collection和Iterator接口。 提供的迭代器   方法iterator()不保证遍历元素   任何特定顺序的优先级队列。如果需要有序遍历,   考虑使用Arrays.sort(pq.toArray())。


对于遍历,您应该考虑在转换为列表后手动排序。对于一次性使用,您应该这样做:

while (!group.isEmpty()) {
    System.out.print(group.poll().getKey() + ",");
}

答案 1 :(得分:0)

如果您想要原始订单,则需要将其作为比较器的次要密钥。