在一次偷看中给对象提供错误值的优先级队列()

时间:2016-04-10 19:16:49

标签: java

所以我为Java类做了这个任务,我遇到了一些障碍。我的代码工作正常,除了在循环的最后一次迭代,其中peek()给出错误的值。每隔一次迭代它就会给出正确的值,所以我迷失了为什么它给出了错误的值。

我的任务是制作一个盒子的优先队列。我们从文本文件中读取浮点值,然后用值填充框。没有框的总和可以大于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;

    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;   

    }
}

包装盒代码(包含Main):     import 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());
    }


}

经过大量调试后,我发现该程序执行以下操作: 读取0.1,0.6,0.11放入框1.读取.765,不适合框1,创建框2.读取.01放入框2(这是最小的总和)。读取0.42,不适合框2,创建框3.将.1492放入框3.读取.667,创建框4.读取.333放入框3(框3具有最小的电流总和)。 读取.111,不适合框3,创建框5 粗体部分是问题所在。它应该读取.111并尝试将其放入方框4,使用.667。但是当我使用peek时,它会带来0.42,0.1492,0.33的盒子,总和为.9022。由于0.667小于0.9022我不明白为什么peek()不给我方框4.任何帮助都会非常感激。

编辑:尝试删除不属于问题的代码。

1 个答案:

答案 0 :(得分:0)

据我所知,问题是当你把.333放在方框3时你没有重新订购这些方框。当你这样做时,方框3不再是最不完整的方框 - 它应该不再是在队列之上。框4应该移动到队列的顶部。但是由于框3保持在队列的顶部,下次当您尝试插入项时,它会查看框3(队列的顶部项)。当它无法插入框3时​​,它会生成一个新框。

要解决此问题,您需要做的就是在添加新值或新框后为队列设置简单的排序功能。这样,最不满的盒子总是在最顶层。