2016-11-29 29 views
0

是否有另一种方法来获取队列(Java)中的最大元素? (请提供可供选择的方法)获取队列|中的最大元素Java

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); 

} 
} 
+3

'Collections.max(queue)'似乎更容易。 –

+0

不,我在说像另一种算法 –

+0

那么你可以写一个并行算法(http://cs.stackexchange.com/questions/21910/parallel-algorithm-for-finding-the-maximum-in-log-n -time-using-n-log-np),但这在Java中有很大的开销,除非你的列表是huuuuuuuge。 –

回答

0

访问一个Queue所有元素的唯一方法是使用iterator()方法 - 你不能(一般)访问由指数的元素(如,一些实现可能,但Queue并不固有)。

因此,您只需逐个迭代元素,即可存储当前最大元素。这正是你在这里做的。

没有什么错你的算法 - 但你已经实现了它可以改进的方式:

  • 不要在类的构造函数做到这一点 - 你不需要构造任何事物的新实例,因为最大值已经存在。在(静态)方法中执行。
  • 不要打印出结果 - 对人或野兽来说没用。将其返回给调用者。
  • 处理队列为空且可能包含空值的情况。 (看看Collections.max的想法的Javadoc)
0

您可以使用Java 8的流排序的队列,它在内部使用相同的算法,但将导致更少的吵闹代码,例如:

public void MaxQueueElement(Queue<E> queue){ 
    Optional<E> max = queue.stream() 
     .max(Comparable::compareTo); 

    if(max.isPresent()){ 
     System.out.println(max.get()); 
    } 
} 

另一种方法是将PriorityQueue与比较器一起使用,并从中获取第一个元素。例如: -

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()); 

} 
+0

更好'Comparator.naturalOrder()'和'max.ifPresent(System.out :: println)'。 – lexicore

0

除非队列不为一些特殊的排序队列像PriorityQueue,从算法的角度来看,有没有更好的办法。由于队列没有任何固有的排序属性,因此您必须先查看队列中的所有元素,然后才能找到它们。

代码或多或少都可以。如果队列包含null,它将失败。通常情况并非如此,但可能会发生。
MaxQueueElement构造有点奇怪。

0

我正在参加计算机科学课,我们不允许使用每个循环。我不确定这是否与你一样。请注意,由于您只想处理队列的前端和末尾,因此每种循环都会破坏队列的用途。具体而言,在我的类中,我们还希望队列在传递到方法之前处于初始状态,而不使用额外的辅助数据结构。下面是我如何去测试:

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; 
} 

由于我提供的限制,这应该工作。我希望这有帮助。