2010-10-16 87 views
0

我必須使用SRTN算法模擬進程調度器,並且在某個部分內部遇到問題。排序隊列

我有一個名爲'Process'的自定義類的隊列,我需要根據名爲'last_prediction'的字段對它進行排序。我的代碼大部分時間都在工作,但是如果您查看我的output的時間:19,就緒隊列中的輸出錯誤(應爲:1004(1.5)1002(2)1003(2))。

這裏是我的代碼:

int count = ReadyQueue.Count; 

     // Copy Queue into Vector 
     ArrayList temp = new ArrayList(); 
     for (int i = 0; i < count; i++) 
     { 
      Process p = (Process)ReadyQueue.Dequeue(); 
      temp.Add(p); 
     } 

     // Sort Vector 
     for (int i = 0; i < count; i++) 
     { 
      double min = ((Process)temp[i]).last_prediction; 
      for (int j=i+1; j<count; j++) 
      { 
       if (((Process)temp[j]).last_prediction < min) 
       { 
        min = ((Process)temp[j]).last_prediction; 
        Process dummy = (Process)temp[j]; 
        temp[j] = temp[i]; 
        temp[i] = dummy; 
       } 
      } 
     } 

     // Copy Vector back into Queue 
     for (int i = 0; i < count; i++) 
     { 
      Process p = (Process)temp[i]; 
      ReadyQueue.Enqueue(p); 
     } 

編輯:好吧,我嘗試使用ICompare,類似於你所付出的hughdbrown.Now我得到一個不同的錯誤:

public class Process 
    { 
     public int process_id; 
     public int arrival_time; 
     public int total_time; 
     public int avg_burst; 
     public int actual_burst; 
     public int last_burst; // SRTN 
     public double last_prediction; // SRTN 
     public int io_delay; 
     public int context_switch_delay; 

     public class ProcessSort : IComparer 
     { 
      public int Compare(object x, object y) 
      { 
       var a = x as Process; 
       var b = y as Process; 
       double aNum = a.last_prediction; 
       double bNum = b.last_prediction; 
       return Compare(aNum, bNum); 
      } 
     } 
    } 

這是錯誤我現在得到:

Unhandled Exception: System.InvalidOperationException: Failed to compare two elements in the array. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
+1

它不會停止成爲一個隊列,一旦你排序嗎?它只是成爲另一個列表。 – 2010-10-16 03:17:04

+0

A1(B1)A2(B2)A3(B3)您是否想根據B值對其進行排序,然後根據它們的A值對具有相同B值的那些進行排序? – blizpasta 2010-10-16 03:37:31

+0

不完全。我需要它,所以進程停留在它的位置,如果它前面的值是等值的 – 2010-10-16 04:16:37

回答

2

我會在這個陣列上使用真正的排序程序,而不是手工製作的插入/冒泡排序。爲你的對象添加一個比較函數。

我也會使用模板化數據集合,而不是ArrayList。您可能有興趣使用此C#PriorityQueue代碼from my website。它具有隊列語義並以排序順序維護項目。


後來:您IComparable的代碼將是這樣的:

public class Process : IComparable 
{ 
    int last_prediction; 
    public int CompareTo(object obj) 
    { 
      Process right = obj as Process; 
      return this.last_prediction.CompareTo(right.last_prediction); 
    } 
} 

後來還是:這裏是有一個排序過程的完整測試程序。在Ubuntu上進行單聲道測試。

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace Comparer 
{ 
    public class Process : IComparable 
    { 
     int last_prediction; 
     public Process(int p) 
     { 
      this.last_prediction = p; 
     } 
     public int CompareTo(object obj) 
     { 
      Process right = obj as Process; 
      return this.last_prediction.CompareTo(right.last_prediction); 
     } 
     public int Prediction { get { return this.last_prediction; } } 
    } 

    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      List<Process> list = new List<Process>(); 
      for (int i = 0; i < 10; i++) 
       list.Add(new Process(10 - i)); 

      System.Console.WriteLine("Current values:"); 
      foreach (Process p in list) 
       System.Console.WriteLine("Process {0}", p.Prediction); 

      list.Sort(); 

      System.Console.WriteLine("Sorted values:"); 
      foreach (Process p in list) 
       System.Console.WriteLine("Process {0}", p.Prediction); 
     } 
    } 
} 
+0

我想現在使用它,但是我得到一個stackoverflow錯誤。有沒有辦法像myArrList.Sort(Process.last_prediction)? – 2010-10-16 02:25:47

+0

看到我上面的編輯 – 2010-10-16 02:44:04

+0

休,非常感謝你的支持。你的排序工作,但它仍然給我像我的類似的輸出。如果所比較的兩個值是相同的值,我不認爲它會交換。這就是爲什麼我混淆了我原來的代碼是交換使用'<'當這應該發生使用'<='作爲比較 – 2010-10-16 04:20:11

0

你有沒有考慮過使用ArrayList.Sort方法,而不是試圖wri你自己的?

-1

啊..使用arraylist.sort

如果烏爾陣列只拿到了號,創建一個新的數字陣列堂妹.. arraylist.sort字符串有一些問題。

,並使用arraylist.sort

把你想和轉換回字符串如果u想要的位置的數量..

+3

你從你的手機發送你的原始答案? :) – 2010-10-16 01:22:50

+0

不是真的..爲什麼呢? – william 2010-10-16 01:59:28

0

這是我會怎麼處理對象進行排序。我們使用List<Process>而不是ArrayList,這樣我們就不需要繼續來回投射它。我並沒有在C#中使用過多的隊列,所以我害怕我對這些事情無能爲力。請注意,此代碼未經測試。 :)

int count = ReadyQueue.Count; 

    // Copy Queue into Vector 
    List<Process> listProcesses = new List<Process>(); 

    for(int i = 0; i < count; i++) 
    { 
     Process p = (Process)ReadyQueue.Dequeue(); 
     listProcesses.Add(p); 
    } 

    // Sort Vector 
    listProcesses.Sort(CompareProcessesByPrediction); 

    // Copy Vector back into Queue 
    foreach(Process p in listProcesses) 
     ReadyQueue.Enqueue(p); 


private static int CompareProcessesByPrediction(Process proc1, Process proc2) 
{ 
    //if they're both not-null, figure out which one is greatest/smallest. 
    //otherwise just pick the one that isn't null 
    if(proc1 == null) 
     return proc2 == null ? 0 : -1; 
    else 
     return proc1 == null ? 1 : proc1.last_prediction.CompareTo(proc2.last_prediction); 
}