none
急! 求救! 檔案 To Array 快速的方法 RRS feed

  • 問題

  • 請問一下,我現在有一個檔案裡面(a.in)有幾個元素用空格區隔

    Ex: abc defr djfit adjd cndje zxios x snd d

    請問一下,我要如何用最快的速度把那些元素放進一個String Array然後用Array.Sort排序完後再把他寫進檔案(a.out)

    我目前這樣寫,不知效率是否高,我需要一個最快的方法,謝謝!

     

                StreamReader a = new StreamReader(File.Open("a.in", FileMode.Open), System.Text.Encoding.Default);
                string b = a.ReadToEnd();
                b = b.Trim();
                string[] c = b.Split(' ');
                Array.Sort(c);
                string e = "";
                foreach (string d in c)
                {
                    e = e + d + " ";
                }
                e = e.Trim();
                StreamWriter f = new StreamWriter(File.Open("a.out", FileMode.Create), System.Text.Encoding.Default);
                f.Write(e);
                f.Close();
    

     

    剛剛那是String的Sort,可是如果是要數字(Int)的Sort,如何做最快呢?

    Ex: 1 9 5 6 8 2 0 -1 -4 -5 -2 -3 10 -100 1000

    以下是我的方法,不知怎樣做可以最快?

     

                StreamReader a = new StreamReader(File.Open("a.in", FileMode.Open), System.Text.Encoding.Default);
                string b = a.ReadToEnd();
                b = b.Trim();
                string[] c = b.Split(' ');
                int[] d = new int[c.Length];
                int i = 0;
                foreach (string e in c)
                {
                    d[i] = int.Parse(e);
                    i++;
                }
                Array.Sort(d);
                string f = "";
                foreach (int g in d)
                {
                    f = f + g + " ";
                }
                f = f.Trim();            
                StreamWriter h = new StreamWriter(File.Open("a.out", FileMode.Create), System.Text.Encoding.Default);
                h.Write(f);
                h.Close();
    

     

    謝謝!

    2011年9月18日 上午 09:55

解答

  • 文件也看一下吧 ...

    http://msdn.microsoft.com/zh-tw/library/6tf1f0bc(v=VS.90).aspx

    Array.Sort() 採用的是快速排序法,會有最差狀況 O(n^2) 的狀況,如果要恆定 O(nlogn),則要改用合併或是堆積排序法,

    Merge Sort: http://www.codeproject.com/KB/recipes/MergeSort.aspx

    Heap Sort: http://www.publicjoe.f9.co.uk/csharp/sort02.html


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年9月18日 上午 10:04
    版主
  • 您好

    關於寫入 StreamWriter 以前的處理部分,字串串接不要用加號串接,改用 String.Join 方法處理

    http://msdn.microsoft.com/zh-tw/library/system.string.join(v=vs.80).aspx


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年9月18日 上午 10:29
    版主
  • 串成一串就是字串處理了.

    不需要轉成Int Array, 反正你讀進來的時後就是字串.

    改變 Array.Sort 方法就可以.

    你可以使用 [Array.Sort 方法 (Array, IComparer)], 然後自己實做 IComparer, 將元素轉成Int 比較.

    ex:

    class IntCompare : System.Collections.IComparer
        {
            int System.Collections.IComparer.Compare(Object x, Object y)
            {
     
                int x1 = ((IConvertible)x).ToInt32(null);
                int y1 = ((IConvertible)y).ToInt32(null);
                return ((new System.Collections.CaseInsensitiveComparer()).Compare(x1, y1));
            }
        }

    你在主程式中的呼叫則是

     String[] str = new String[] { "0""-100""1""8""3" };
     Array.Sort (str,new IntCompare() );

     

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年9月18日 上午 11:42
    版主

所有回覆

  • 文件也看一下吧 ...

    http://msdn.microsoft.com/zh-tw/library/6tf1f0bc(v=VS.90).aspx

    Array.Sort() 採用的是快速排序法,會有最差狀況 O(n^2) 的狀況,如果要恆定 O(nlogn),則要改用合併或是堆積排序法,

    Merge Sort: http://www.codeproject.com/KB/recipes/MergeSort.aspx

    Heap Sort: http://www.publicjoe.f9.co.uk/csharp/sort02.html


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年9月18日 上午 10:04
    版主
  • 謝謝你的方法真的是比較高明,不過我困擾的不是排序的方法

    我想了解的是如何快速的互換Data跟Array

    謝謝,救命!

    2011年9月18日 上午 10:16
  • Data的形式是什麼 ?

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年9月18日 上午 10:18
    版主
  • 純文字檔 (a.in)

    Ex1:  z y x w v u t s r q

    Ex2:  2 5 7 8 6 4 2 3 1 0 5 7 -10 100 28

    第一個想做String的Array.Sort

    第二個想做Int的Array.Sort

    謝謝!

    2011年9月18日 上午 10:21
  • 您好

    關於寫入 StreamWriter 以前的處理部分,字串串接不要用加號串接,改用 String.Join 方法處理

    http://msdn.microsoft.com/zh-tw/library/system.string.join(v=vs.80).aspx


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年9月18日 上午 10:29
    版主
  • Int Array 要如何像 String Array 一樣 Join成一串

    就如  {0, 1, 2, 3, 4, 5}   -->  "0 1 2 3 4 5"

    2011年9月18日 上午 11:00
  • 串成一串就是字串處理了.

    不需要轉成Int Array, 反正你讀進來的時後就是字串.

    改變 Array.Sort 方法就可以.

    你可以使用 [Array.Sort 方法 (Array, IComparer)], 然後自己實做 IComparer, 將元素轉成Int 比較.

    ex:

    class IntCompare : System.Collections.IComparer
        {
            int System.Collections.IComparer.Compare(Object x, Object y)
            {
     
                int x1 = ((IConvertible)x).ToInt32(null);
                int y1 = ((IConvertible)y).ToInt32(null);
                return ((new System.Collections.CaseInsensitiveComparer()).Compare(x1, y1));
            }
        }

    你在主程式中的呼叫則是

     String[] str = new String[] { "0""-100""1""8""3" };
     Array.Sort (str,new IntCompare() );

     

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年9月18日 上午 11:42
    版主
  • 謝謝大家的解答!
    2011年9月18日 下午 12:51