2016-11-29 3 views
0

キュー(Java)でmax要素を取得する別の方法はありますか?いくつかの実装がかもしれない、あなたは(一般的に)のように(インデックスで要素にアクセスすることはできません - は、(代替的なアプローチを提供してください)キュー内の最大要素を取得する| 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)しかし、あなたのリストがhuuuuuuuugeでない限り、それはJavaで多くのオーバーヘッドです。 –

答えて

0

Queue内のすべての要素にアクセスするための唯一の方法は、iterator()メソッドを使用することですしかし、Queueは本質的にはありません)。

このように、現在の最大要素を格納しながら、一度に1つずつ要素を反復処理するだけで済みます。これはまさにあなたがここでやっていることです。

あなたのアルゴリズムでは何も問題はありません - しかし、あなたはそれが改善される可能性が実装されてきた方法は:

  • は、クラスのコンストラクタでこれをしないでください - あなたが構築する必要はありません。最大値が既に存在するため、何かの新しいインスタンス。それは静的な方法で行います。
  • 結果をプリントアウトしないでください。これは人間や獣にとっては役に立たないものです。それを呼び出し元に返します。
  • キューが空で、NULLを含むケースを処理します。あなたはキューをソートするためのJava 8のストリームを使用することができます
0

を(アイデアをCollections.maxのJavadocを見て)、それは内部的に同じアルゴリズムを使用しますが、ノイズの少ないコード、例えばになります:

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

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

もう1つの方法は、コンパレータで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のようないくつかの特殊なソートされたキューではない場合を除き。キューには本質的なソートプロパティはないので、キューのすべての要素を調べてから、それらを見つける必要があります。

コードは多かれ少なかれOKです。キューにnullが含まれていると失敗します。これは通常そうではありませんが、発生する可能性があります。
MaxQueueElementの構造はやや奇妙です。

0

私はコンピューターサイエンスのクラスを取っていますが、私たちはfor eachループを使用することはできません。それがあなたと同じかどうかは分かりません。キューの先頭と末尾のみを処理したいので、各ループの種類はキューの目的を無効にすることに注意してください。私のクラスでは、余分な補助データ構造を使わずにメソッドに渡す前にキューを元の状態にしたいと思っています。ここで私はテストでそれについてどうやって行くのですか?

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

私が提示した制限がありますが、これはうまくいくはずです。私はこれが役立つことを願っています

関連する問題