Java: элемент был потерян после передачи того же массива listArray следующей функции - PullRequest
0 голосов
/ 07 ноября 2019

Существует проблема в передаче 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

Были ли какие-либо ограничения на передачу списка списков для более чем двухк аргументу в методе?

...