是否有另一种方法可以在队列(Java)中获取max元素? (请提供替代方法)
import java.util.*;
public class MaxQueueElement<E extends Comparable<E>> {
public MaxQueueElement(Queue<E> queue){
E max= queue.peek(); // initialize max with head of queue
for(E e : queue){
if(e.compareTo(max) > 0){
max = e;
}
}
System.out.println(max);
}
}
答案 0 :(得分:0)
访问Queue
中所有元素的唯一方法是使用iterator()
方法 - 您无法(通常)按索引访问元素(如某些实现可能,但Queue
本身并不存在。
因此,您所能做的就是一次迭代一个元素,存储当前的最大元素。这正是你在这里所做的。
您的算法没有任何问题 - 但您实施该算法的方式可以改进:
Collections.max
的Javadoc获取想法)答案 1 :(得分:0)
您可以使用Java 8的流对Queue进行排序,它在内部使用相同的算法,但会产生较少的噪声代码,例如:
public void MaxQueueElement(Queue<E> queue){
Optional<E> max = queue.stream()
.max(Comparable::compareTo);
if(max.isPresent()){
System.out.println(max.get());
}
}
另一种方法是将PriorityQueue
与比较器一起使用,并从中获取第一个元素。 e.g:
public void MaxQueueElement2(Queue<E> queue){
PriorityQueue<E> pQueue = new PriorityQueue<>((E e1, E e2)->e1.compareTo(e2));
pQueue.addAll(queue);
System.out.println(pQueue.peek());
}
答案 2 :(得分:0)
除非队列不是像PriorityQueue
这样的特殊排序队列,否则从算法的角度来看,没有更好的方法。由于队列没有任何内部排序属性,因此您必须先检查队列中的所有元素。
代码或多或少都可以。如果队列包含null
,它将失败。通常情况并非如此,但可能会发生
MaxQueueElement
构造有点奇怪。
答案 3 :(得分:0)
我参加了计算机科学课程,但我们不允许使用每个循环。我不确定它和你是否一样。请注意,每个循环类型都会破坏Queue的用途,因为您只想处理队列的前端和末尾。具体来说,在我的课程中,我们还希望队列在传递到方法之前处于其原始状态,而不使用额外的辅助数据结构。以下是我将如何进行测试:
public E findMaxQueueElement(Queue<e> queue) { //my test would ask me to return the max value
E max = queue.remove();
queue.add(max); //add it back to the end
for(int i=0; i<queue.size()-1; i++) {
E current = queue.remove();
if (current.compareTo(max) > 0) {
max = current;
}
queue.add(current);
}
return max;
}
由于我提供的限制,这应该有效。我希望这会有所帮助。
答案 4 :(得分:0)
我认为您也可以利用
Collections.max(queue)
,如果出现队列