所以我为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.任何帮助都会非常感激。
编辑:尝试删除不属于问题的代码。
答案 0 :(得分:0)
据我所知,问题是当你把.333放在方框3时你没有重新订购这些方框。当你这样做时,方框3不再是最不完整的方框 - 它应该不再是在队列之上。框4应该移动到队列的顶部。但是由于框3保持在队列的顶部,下次当您尝试插入项时,它会查看框3(队列的顶部项)。当它无法插入框3时,它会生成一个新框。
要解决此问题,您需要做的就是在添加新值或新框后为队列设置简单的排序功能。这样,最不满的盒子总是在最顶层。