2016-11-29 28 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; 
} 

由於我提供的限制,這應該工作。我希望這有幫助。