我正在研究这个问题: 将一个数字列表分成连续数字组,但应保留其原始顺序? 例如 输入:8,2,4,7,1,0,3,6 输出:2,4,1,0,3和8,7,6
我实施了一个解决方案,简单地说:
但是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();
}
}
}
答案 0 :(得分:2)
除了打印方式外,您的代码看起来正确。 : - )
当您遍历优先级队列时,不要指望它按照您期望的顺序为您提供元素。如果您需要按顺序排列项目,则应该实际使用.peek(..)
或.poll(..)
方法。
来自Javadoc:
这个类及其迭代器实现了所有可选方法 Collection和Iterator接口。 提供的迭代器 方法iterator()不保证遍历元素 任何特定顺序的优先级队列。如果需要有序遍历, 考虑使用Arrays.sort(pq.toArray())。
对于遍历,您应该考虑在转换为列表后手动排序。对于一次性使用,您应该这样做:
while (!group.isEmpty()) {
System.out.print(group.poll().getKey() + ",");
}
答案 1 :(得分:0)
如果您想要原始订单,则需要将其作为比较器的次要密钥。