这是我的FCFS
算法。
我有一个名为atst
的二维数组,意思是arrival time, service time
。
数组大小为5*5
。
我的数组的逻辑图片如下:
第一栏:流程名称
第二栏:到达时间
第三栏:服务时间(突发时间)
第四列和第五列将按照到达时间(第二列)排序等待时间和排序后的总时间。
我的问题是按升序对第二列(到达时间)排序数组。
我的代码:
// Sort array by arrival times
int[] temp = new int[3];
for (int i = 0; i < atst.length; i++) {
if (atst[i][1] > atst[i + 1][1]) { // Then swap!
temp[i] = atst[i][1];
atst[i][1] = atst[i + 1][1];
atst[i + 1][1] = temp[i];
}
}
我使用temp[3]
因为在排序之前其他列(第四和第五列)是空的(零)。
但是此代码在此行中生成arrayOutOfBoundException
:temp[i] = atst[i][1];
。
如何解决这个问题?
答案 0 :(得分:1)
你走了:
// Sort array by arrival times
int[] temp = new int[atst.length]; //to avoid any out of bound.
for (int i = 0; i < atst.length-1; i++) { //-1 will solve
if (atst[i][1] > atst[i + 1][1]) { // Then swap!
temp[i] = atst[i][1];
atst[i][1] = atst[i + 1][1];
atst[i + 1][1] = temp[i];
}
}
希望这会奏效。你已经超过了atst[i+1]
中绑定的最后一个i
值的数组。这个-1
将解决您arrayOutOfBoundException
的问题。
编辑:试试这个:
// Sort array by arrival times
int[] temp = new int[atst.length]; //to avoid any out of bound.
for (int i = 0; i < atst.length-1; i++) { //-1 will solve
for (int j = 0; i < 2; j++) {
if (atst[i][j] > atst[i + 1][j]) { // Then swap!
temp[i] = atst[i][j];
atst[i][j] = atst[i + 1][j];
atst[i + 1][j] = temp[i];
}
}
}
答案 1 :(得分:1)
您的设计在几个方面被打破。
首先,你根本不应该使用二维数组。由于列具有不同的含义,因此包含命名字段的对象数组将为您节省大量工作。
其次,你所展示的并不接近排序算法。即使在修复编码问题之后,对数组进行单次传递也不足以对其进行排序。看看Arrays.sort()
。
第三,即使粗略检查,您的代码也必须。变量i
从0
迭代到atst.length - 1
。但你已经分配temp
只有3个职位。除非atst.length
确定不超过3,否则您将在temp
的末尾以范围错误运行。
第四,您要对行进行排序。您尝试编写的代码将仅交换每行的第二列。阵列的其余部分将保持原样。我认为这不是你想要的。
退后一步。认为。扔掉这个代码。再试一次。