我得到了这个奇怪的异常,我真的不明白为什么..我试过调试并发现它在运行时出错了:
opt[i][j] = Double.POSITIVE_INFINITY;
当i == 0且j == 1时,但这不应该发生,因为在这种情况下,opt是9x6矩阵。
这是我的代码:
public class Versie3 {
private int desCap;
private int currentCap;
private int maxCap;
private int timeSlot;
private static ArrayList<Double> prices;
private double[][] opt = new double[timeSlot + 1][maxCap + 1];
public Versie3() throws FileNotFoundException {
}
public void readInput(String s) throws FileNotFoundException
{
FileReader fr = new FileReader(s);
Scanner sc = new Scanner(fr);
timeSlot = sc.nextInt();
maxCap = sc.nextInt();
currentCap = sc.nextInt();
desCap = sc.nextInt();
prices = new ArrayList<Double>(timeSlot);
while (sc.hasNextDouble()) {
prices.add(sc.nextDouble());
}
}
public double calculateOptimal()
{
for (int i = 0; i <= timeSlot; i++)
{
for (int j = 0; j <= maxCap; j++)
{
if (i == 0)
{
if (j != desCap)
{
opt[i][j] = Double.POSITIVE_INFINITY; // <--here it goes Wrong!
}
else
{
opt[i][j] = 0;
}
}
else if (j == 0)
{
opt[i][j] = Math.min(opt[i - 1][j],
opt[i - 1][j + 1]
- prices.get(i-1));
}
else if (j == maxCap)
{
opt[i][j] = Math.min(opt[i - 1][j],
opt[i - 1][j - 1]
+ prices.get(i-1));
}
else
{
opt[i][j] = Math.min(Math.min(opt[i - 1][j],
opt[i - 1][j - 1]
+ prices.get(i - 1)),opt[i - 1][j + 1]- prices.get(i-1));
}
}
}
return opt[timeSlot][currentCap];
}
public static void main(String[] args) throws FileNotFoundException {
Versie3 v3 = new Versie3();
v3.readInput("input.txt");
System.out.println("prices: " + prices.toString());
System.out.println("timeSlot: " + v3.timeSlot);
System.out.println("maxCap: " + v3.maxCap);
System.out.println("currentCap: " + v3.currentCap);
System.out.println("desCap: " + v3.desCap);
//System.out.println("minimum cost: "+v3.calculateOptimal());
System.out.println(v3.prices.size());
}
}
这是我正在阅读的输入文件:
8 5 2 5
2.2 3 5 6.5 5 5 3 1.8
在这种情况下:
timeSlot = 8
maxCap = 5
currentCap = 2
desCap = 5
第二行显示每个时段的价格。总共8个。
感谢任何帮助。
答案 0 :(得分:3)
opt
和timeSlot
设置之前, maxcap
在构建时初始化。
所以你创建一个数组
private double[][] opt = new double[0 + 1][0 + 1];
用户输入值后,必须在readInput
方法中创建数组。
答案 1 :(得分:2)
您正在使用maxCap
和timeSlot
创建数组,但它们的默认值仍为0
。 readInput()
还没有被调用,所以你怎么知道制作数组的大小?
在您阅读maxCap
和timeSlot
后创建数组。
答案 2 :(得分:1)
在确定maxCap等于什么之前,先启动opt阵列。
答案 3 :(得分:1)
创建类Versie3
的对象时,maxCap
和timeSlot
的默认值为0
,数组opt
创建时使用大小1 x 1
。
在此之后,您可以阅读重写maxCap
和timeSlot
值的文件,但数组大小仍然不变。
要解决此问题,请在阅读尺寸后在函数readFile
中为数组分配内存。