2016-04-10 4 views
0

このクラスはJavaクラス用に割り当てられています。私のコードは、peek()が間違った値を返すループの最後の反復を除いて、正常に動作しています。他のすべての反復は正しい値を与えるので、なぜそれが間違った値を与えるのか分かりません。Peek()の1回の呼び出しで間違った値を与えるオブジェクトの優先度キュー

私の割り当ては、ボックスの優先度キューを作ることです。我々は、テキストファイルからフロート値を読み取り、ボックスに値を入力します。ボックスの合計が1.0を超えることはできません。

テキストファイルからのデータがある:0.1、0.6、0.11、0.765、0.01、0.42、0.1492,0.667、0.333、0.111 コード: ボックスクラス:

public class box implements Comparable<box> 
{ 
//instance variables 
private ArrayList<Float> values;  
private Float totalValue=0.0f; 

public box() 
{ 
    values = new ArrayList<Float>();   
} 
public box(Float val) 
{ 
    values = new ArrayList<Float>(); 
    values.add(val);   
} 

//add new values to the box 
public void addVal(Float newVal) 
{ 
    values.add(newVal); 
} 
/* 
* Adds up all the values in the box, returns sum as Float. 
*/ 
public Float findSum() 
{ 
    totalValue=0.0f; 
    for(Float val : values) 
    { 
     totalValue=totalValue+val; 
    } 
    return totalValue;  
} 

}

コンパイラのコード import java.util.Comparator; PackingBoxes(メインが含まれている)ため

public class boxComparator implements Comparator<box> 
    { 
     //compare method for boxes 
     public int compare(box a, box b) 
     { 
     if (a.findSum()>b.findSum()) 
      return 10; 
     else if (a.findSum()<b.findSum()) 
      return -10; 
     else 
      return 0; 

    } 
} 

コード: 輸入java.utilの。 ; import java.io.;多くのデバッグ後

public class PackBoxes 
{ 
public static void main(String[] args) 
{ 
     ... 
     boxComparator compSum = new boxComparator(); 

     ... 
    *Strategy A: As each new item is processed, it is placed in the 
    *   fullest box that can hold it. 
    */ 
    System.out.println("========="); 
    System.out.println("Packing via most-filled strategy:"); 
    System.out.println(); 

    //Create new priorityqueue of boxes for strategy A 
    PriorityQueue<box> boxesA = new PriorityQueue<box>(11,compSum); 
    //add first box to queue 
    boxesA.add(new box()); 


    //for each loop, goes through arrayList L 
    for(Float x : L) 
    {  

     //if element + sum of current box is less than 1 put element 
     //into the current box 

     if(x + boxesA.peek().findSum() <1) 
     {    
      boxesA.peek().addVal(x); 
     } 
     //if element + sum of current box is greater than 1, then make 
     // a new box 
     else 
     {    
      boxesA.add(new box(x));     
     } 

    } 
    System.out.println(boxesA.size()+" boxes were used."); 


    //print queue 
    while(!boxesA.isEmpty()) 
    { 
     System.out.println(boxesA.poll().findSum()); 
    } 


} 

、私はプログラムは、次のないことを発見しました:ボックス2を作成し、 読む0.1、0.6、読む0.765箱1に入れ0.11は、ボックス1でフィットdoes't。ボックス2に入れられた.01を読んでください(これは合計が最小です)。 0.42を読んで、ボックス2に収まらない、ボックス3を作成する。ボックスに.1492を入れる。3.667を読んでボックスを作る。4.ボックス3に入れた.333を読む(ボックス3は現在の合計が最小である)。 .111を読み、ボックス3に収まらない、ボックス5を作成する 太字部分が問題です。それは0.111を読んで、.667でボックス4に入れてください。しかし、私が覗き見をすると0.42、0.1492、0.33のボックスが表示され、合計は.9022となります。 0.667が0.9022より小さいので、なぜpeek()が私にボックス4を与えていないのか理解できません。ここの助けがあれば幸いです。

編集:問題の一部ではないコードを削除しようとしました。

+0

[最小テストケース](http://stackoverflow.com/help/mcve)を作成してください。 –

答えて

0

私が知る限り、問題はボックス3に0.333を入れたときにボックスの順序を変更しないということです。これを行うと、ボックス3はもはや最小のフルボックスではなくなりました。キューの一番上にある。ボックス4はキューの先頭に移動する必要があります。しかし、ボックス3はキューの上にとどまっているので、次にアイテムを挿入しようとすると、ボックス3(キューの一番上のアイテム)が表示されます。ボックス3に挿入できなかった場合は、新しいボックスを作成します。

これを解決するには、新しい値または新しいボックスを追加した後で、キューの単純な並べ替え機能を配置するだけです。そうすれば、一番小さいボックスが常に上になります。

+0

私を助けるために時間を割いていただきありがとうございます。私は優先度キューの全体のポイントは、最小値が頭であり、あなたがpeek()またはpoll()を実行するときに最小値を取得することだと思いました。プログラムが値0.333になると、ボックス3はその時点で最も低い合計を持つので、現在のボックス4ではなく、ボックス3に入れます。最後に、すべてのボックスと印刷物をポーリング()して、0.111、0.667、0.775、0.81、0.9022の順に出てきます。現在のボックスがキューの上にとどまる唯一の時間は、そのループの最後の反復です。 – SysKonfig

+0

あなたはそうです。優先度キューはそれ自身をソートします。しかし、あなたはそのアイテムのいずれかを変更するたびに、それ自体がソートされますか?簡単なテストとして、これを試してみてください。単純に新しい値をボックスに追加するのではなく、キューからボックスを削除し、アイテムをボックスに追加して、ボックスをキューに戻します。私はそれがうまくいくと賭けるでしょう。 – nhouser9

+0

あなたは正しいです。本当にありがとう、あなたは完全な人生を満喫しています。キュー内の項目を変更するだけでは更新ができない場合は、キューを変更する必要があります。私の仕事で私を助けただけでなく、もっと重要なのは、優先順位キューの収集の仕方が分かりました。ありがとうございました。 – SysKonfig

関連する問題