Существует проблема в передаче listArray
функции после того, как я передал тот же listArray
следующей функции. Элемент в первом индексе отсутствовал.
Я пытался найти проблему в функциях, чтобы узнать, была ли она в функции. Но после проверки проверенной переданной коллекции, проблема заключалась в передаче аргумента.
public static void main(String[] args){
List<Process> listArray = new ArrayList<Process>(); // The `Process` here is user defined datatype
***some loop code to get an input from the user...
Chart(listArray);
List<Process> fcfsListArray = new ArrayList<Process>(fcfsScheduling(listArray));
for(Process k : listArray){
System.out.println(k.getProcessName()); // TEST CHECK fcfs
}
List<Process> sjfNpListArray = new ArrayList<Process>(sjfNpScheduling(listArray));
for(Process k : listArray){
System.out.println(k.getProcessName()); // TEST CHECK sjfNp
}
//some functions...
}
public static List<Process> fcfsScheduling(List<Process> listArray){
int n = listArray.size();
int timeFrame = startingTimeFrame(listArray);
int processCompleted = 0;
while(processCompleted != n){
for(int index = 0 ; index < n ; index ++){
Process currentProcessor = listArray.get(index);
boolean isFinished = currentProcessor.getisCompleted();
if(isFinished != true){
int currentArrival = currentProcessor.getProcessArrival();
if(currentArrival <=timeFrame){
currentProcessor.setProcessStart(timeFrame);
timeFrame+=currentProcessor.getProcessBurst(); // Sets the time frame where the current process will end.
currentProcessor.setProcessEnd(timeFrame);
currentProcessor.setisCompleted(true);
computeWaitingTime(currentProcessor); // compute for the waiting time of the processor;
listArray.set(index, currentProcessor);
processCompleted += 1;
}
}
}
}
return listArray;
}
public static List<Process> sjfNpScheduling(List<Process> listArray){
int n = listArray.size();
int processCompleted = 0;
int timeFrame = startingTimeFrame(listArray);
// Loop until all processors are completely finished
while(processCompleted != n){
Process toProcess = new Process();
int processIndex = 0;
int leastBurstTime = Integer.MAX_VALUE;
// Find for the PROCESS with the least ARRIVAL TIME and BURST TIME
for(int i = 0 ; i < listArray.size(); i++){
Process currentProcess = listArray.get(i);
int processBurst = currentProcess.getProcessBurst();
int processArrival = currentProcess.getProcessArrival();
boolean isCompleted = currentProcess.getisCompleted();
if(isCompleted != true){
if(processBurst < leastBurstTime && processArrival <= timeFrame){
toProcess = currentProcess;
leastBurstTime = processBurst;
processIndex = i;
}
}
}
int processBurstTime = toProcess.getProcessBurst();
toProcess.setProcessStart(timeFrame);
timeFrame+=processBurstTime;
toProcess.setProcessEnd(timeFrame);
toProcess.setisCompleted(true);
computeWaitingTime(toProcess);
listArray.set(processIndex, toProcess);
processCompleted += 1;
}
return listArray;
}
public static int startingTimeFrame(List<Process> listArray){
int n = listArray.size();
int leastTime = Integer.MAX_VALUE;
for(int x = 0; x < n; x++){
int arrivalTime = listArray.get(x).getProcessArrival();
if(arrivalTime < leastTime) leastTime = arrivalTime;
}
return leastTime;
}
public static void Chart(List<Process> listArray){
System.out.println("=================================================");
System.out.println("|++++++++++++++++ PROCESS CHART ++++++++++++++++|");
System.out.println("=================================================");
System.out.println();
int n = listArray.size();
int matSizeRow = n + 1;
String[][] matChart = new String[matSizeRow][3];
matChart[0][0] = "\t Process";
matChart[0][1] = "\t Burst";
matChart[0][2] = "\t Arrival \t";
for(int x = 0; x < n;x++){
Process currentProcess = listArray.get(x);
int index = x+1;
matChart[index][0] = "\t "+currentProcess.getProcessName();
matChart[index][1] = "\t\t "+Integer.toString(currentProcess.getProcessBurst());
matChart[index][2] = "\t\t "+Integer.toString(currentProcess.getProcessArrival()) +" \t";
}
for(String[] row :matChart){
System.out.println(Arrays.toString(row));
System.out.println();
}
}
//USER DEFINED DATATYPE : PROCESS
public class Process{
private String processName;
private int processBurst;
private int processArrival;
private int processPriority;
private int processStart;
private int processEnd;
private double waitingTime = 0;
private boolean isCompleted = false;
public void setProcessPriority(int n){
this.processPriority = n;
}
public int getProcessPriority(){
return this.processPriority;
}
public void setisCompleted(boolean condition){
this.isCompleted = condition;
}
public boolean getisCompleted(){
return this.isCompleted;
}
public void setWaitingTime(double objStart){
this.waitingTime = objStart;
}
public double getWaitingTime(){
return this.waitingTime;
}
public void setProcessStart(int objStart){
this.processStart = objStart;
}
public int getProcessStart(){
return this.processStart;
}
public void setProcessEnd(int n){
this.processEnd = n;
}
public int getProcessEnd(){
return this.processEnd;
}
public void setProcessName(String objName){
this.processName = objName;
}
public String getProcessName(){
return this.processName;
}
public void setProcessBurst(int objBurst){
this.processBurst = objBurst;
}
public int getProcessBurst(){
return this.processBurst;
}
public void setProcessArrival(int objArrival) {
this.processArrival= objArrival;
}
public int getProcessArrival(){
return this.processArrival;
}
}
Предположим, я ввел переменную 3 Process в listArray
, каждая из которых имеет имя p1,p2,p3
При первом прохождении listArray функции Chart
я проверил элементы, отобразив каждое из имен переменной Process в listArray и все еще в порядке.
ProcessName
p1
p2
p3
Также перед передачейlistArray для fcfsScheduling
, все еще в порядке. (Вывод TEST CHECK fcfs)
p1
p2
p3
Когда он был передан в sjfNpScheduling
, вывод был следующим:
null
p2
p3
ОБНОВЛЕНИЕ: Было сказано, что проблема былав вызове функции sjfNpscheduling лежит проблема, но после отладки кода путем простого удаления вызова fcfsScheduling сработал sjfNpScheduling.
p1
p2
p3
Были ли какие-либо ограничения на передачу списка списков для более чем двухк аргументу в методе?