【问题标题】:how to copy an array into a jagged array如何将数组复制到锯齿状数组中
【发布时间】:2015-12-11 09:41:27
【问题描述】:

当我尝试将数组复制到锯齿状数组中时。我的目标是获取一个 char 类型的数组,将“单词”分成单独的数组(我使用了一个已经工作的函数)并希望将它们放入一个数组中。

static char[][] split_string(char[] str)
{
    int length = count_words(str);
    char[][] sentence = new char[length][];
    int start = 0;
    int end = 0;
    int word = 0;
    int i = -1;
    while (i != str.Length)
    {
     i++;
     if (str[i]==' ')
     {
      end = i-1;
      char[] aux_array = substring(str, start, end);
      //issue
      aux_array.CopyTo(sentence[word], 0);
      //alternative (not working either)
      /*
      for(int j=0; j<aux_array.Length;j++)
      {
       sentence[word][j] = aux_array[j];
      }
      */
      while (str[i]==' ')
      {
       i++;
      }
      word++;
      start = i;
     }
    }
    return sentence;
   }

有关信息,
子字符串 if 的形式:substring(array, int, int) -> array count_word 的形式为:count_word(array) -> int

【问题讨论】:

标签: c# arrays jagged-arrays


【解决方案1】:

我的目标是获取一个 char 类型的数组,将“单词”分成单独的数组(我使用了一个已经可以工作的函数)并希望将它们放入一个数组中。

然后将它们放入数组中

//...
sentence[word] = substring(str, start, end);

请注意,锯齿状数组元素默认为null,并且您没有分配它们,因此您可能会遇到空引用异常。如果你真的需要对返回的数组做一个副本,那么最简单的方法就是使用Array.Clone这样的方法

sentence[word] = (char[])substring(str, start, end).Clone();

【讨论】:

  • 显然它正在工作,但现在我在尝试运行它后在“if (str[i]==' ')”处得到一个“超出范围异常”
  • @LoïcBazin 好吧,这是您的代码中与原始问题无关的另一个问题。您可以使用while (i &lt; str.Length &amp;&amp; str[i]==' ') 修复它,但看起来您的代码也会漏掉最后一个字。
【解决方案2】:

使用字符串而不是原始 char 数组更容易,但我认为您决定使用 char 数组是有意的。

简化代码的一种方法是在执行过程中构建 char 数组,而不是预先分配它。 .NET 数组具有固定大小,但 List&lt;T&gt; 允许您增加项目集合。

您还可以将函数更改为迭代器块以进一步简化它。当一个词完成时,你yield return它给来电者。

IEnumerable<char[]> SplitString(char[] str) {
  var word = new List<char>();
  foreach (var ch in str) {
    if (ch == ' ') {
      if (word.Count > 0) {
        yield return word.ToArray();
        word = new List<char>();
      }
    }
    else
      word.Add(ch);
  }
  if (word.Count > 0)
    yield return word.ToArray();
}

这个函数不会返回一个数组所以如果你想要一个数组数组(锯齿状数组)你需要使用ToArray():

var str = "The quick brown fox jumps over the lazy dog".ToCharArray();
var result = SplitString(str).ToArray();

此代码将正确处理源字符串开头和结尾的多个空格和空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2021-05-04
    • 2016-11-09
    相关资源
    最近更新 更多