获取队列中的最大元素Java的

时间:2016-11-29 22:43:05

标签: java generics queue

是否有另一种方法可以在队列(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);

 }
}

5 个答案:

答案 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),如果出现队列