2014-07-01 88 views
2

我要从标准输入读取一堆空格分隔的整数(35 33 2 3 251等)。输入可能是数百万英寸长,所以我想确保读取速度尽可能快。目前,我敢肯定这是不是这样的:)阅读空格分隔的整数

这是我的本钱:

string[] stringArr = Console.ReadLine().Split(' '); 
var len = stringArr.Length; 
int[] intArr = new int[len]; 
for (int i = 0; i < len; i++) 
    intArr[i] = Convert.ToInt32(stringArr[i]);  

以上的伎俩,但它似乎真的笨拙的我。我过去并没有在C#中使用stdin,但我想有很多方法可以做到这一点?

+2

你忘了问一个问题。 –

+0

我想象的问题是你想这是快速的。整数的排序是否重要? –

+2

这可能属于[codereview](http://codereview.stackexchange.com/)? –

回答

2

这不是最佳答案,但它的方向是正确的,因为它避免了“昂贵” Split和解析:

var str = "10 20 13 45 78"; 

var ints = new List<int>(str.Length/2); // Approximating the likely final size of the int array 
int result = 0; 
for(var i = 0; i < str.Length; i++) 
{ 
    var c = str[i]; 

    if(c == ' ') 
    { 
     ints.Add(result); 
     result = 0; 
     continue; 
    } 

    result = 10 * result + (c - '0'); 
} 

    // We didn't add the last char yet 
var lastChar = str[str.Length - 1]; 

if(lastChar != ' ') 
{ 
    ints.Add(result); 
} 

之后,你可以用循环展开,不安全的内存访问,并与yield return代替buffe懒洋洋地得到他们估计整数名单的最终大小(或者是不同的启发式实验把它全部打开)。所有这一切取决于你的约会是什么样子,它有多大。

请注意,这假定所有的整数都是正数,但增加对负数的支持是微不足道的。

+0

它让我很困惑,C#似乎没有与Java的扫描器类相当的功能。还有什么让我感到困惑的是,这比我以前的要慢一些:) –

+0

划痕。它实际上快了5倍。更有意义。 –

5

您可以通过文字读字符和只是在做数学题做到这一点最好:

static void Main(string[] args) 
{ 
    foreach (int i in Read(Console.In)) 
    { 
     Console.WriteLine(i); 
    } 
} 

static IEnumerable<int> Read(TextReader rdr) 
{ 
    int ch; 
    bool neg = false; 
    int value = 0; 
    int count = 0; 

    while (-1 != (ch = rdr.Read())) 
    { 
     if (ch == 9 || ch == 10 || ch == 13 || ch == 32) 
     { 
      if (count > 0) 
       yield return neg ? -value : value; 
      count = 0; 
      value = 0; 
      neg = false; 
     } 
     else if (count == 0 && ch == '-') 
     { 
      neg = true; 
     } 
     else if (ch >= '0' && ch <= '9') 
     { 
      count++; 
      value = value*10 + (ch - '0'); 
     } 
     else 
      throw new InvalidDataException(); 
    } 

    if (count > 0) 
     yield return neg ? -value : value; 
} 
+0

我认为Console.In不处理字节,是问题。它处理字符。它可能替换为Console.OpenStandardInput。 – bashkan

+0

@serbasi我正在阅读字符,而不是字节。因此使用TextReader而不是OpenStandardInput,它返回一个流。 –

相关问题