【问题标题】:Get Length Of Columns in Jagged Array获取交错数组中的列长度
【发布时间】:2016-12-08 21:34:38
【问题描述】:

我在提取锯齿状数组中的列长度时遇到问题,如下所示:

例如,如何获取第 2 列(索引 1 和长度 8)或第 5 列(索引 4 和长度 4)的长度?与行相同。我需要指定行的长度。

【问题讨论】:

  • 向我们展示一些我们可以帮助您的代码示例
  • @Quantic 他说的是列长度,所以我认为他想遍历数组并计算该行是否包含所需列的任何内容
  • @BlakeThingstad 哦,我明白了,是的,特定列(在他的图片中)的“长度”无法从内置方法调用中计算出来,您需要迭代每个子数组查看它是否包含该索引,并且包含该索引的数量是列的“长度”。确实需要查看一些代码,这样我们就不会混淆哪个索引表示“行”,而哪个索引表示 OP 的图片的“列”。我的原始评论不正确,因此我将其删除。

标签: c#


【解决方案1】:

getColumnLength 方法只是遍历每一行并检查该行是否足够长以使列在其中。如果是,则将其添加到具有该列的行数中。

public class Program {
    public static void Main(string[] args) {
        int[][] jaggedArray = {
            new int[] {1,3,5,7,9},
            new int[] {0,2,4,6},
            new int[] {11,22} 
        };

        Console.WriteLine(getColumnLength(jaggedArray, 4));

        Console.WriteLine("Press any key to continue. . .");
        Console.ReadKey();
    }

    private static int getColumnLength(int[][] jaggedArray, int columnIndex) {
        int count = 0;
        foreach (int[] row in jaggedArray) {
            if (columnIndex < row.Length) count++;
        }
        return count;
    }
}

【讨论】:

  • 谢谢@Blake Thingstad!这种方法效果很好!
  • 我想注意的是,conventional 将其称为 Count 而不是 Length,因为列元素不一定是连续的。 OP 恰好在列方向上有连续的元素,但元素的数量是相同的,无论每一行是否混合。这非常小,但 OP 的图片使它看起来列方向以某种方式相关(因为每个元素都是连续的),但这对于锯齿状数组来说是偶然的。再看容量可能是最合适的名称。
  • @Quantic 实际上我没有考虑过这一点,因为我从未真正使用过锯齿状数组,希望 OP 的数组是连续的,否则我想知道这是否可能有一些错误。跨度>
  • 不,我认为您的代码很好。我的意思是在你的代码中你可以交换两个数组的顺序。从new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22} 移动到new int[] {1,3,5,7,9}, new int[] {11,22}, new int[] {0,2,4,6},现在76 不再是连续的(如果你像OP 一样画图,则不再接触),但“容量”或“计数”仍然是2。抱歉,如果这只会增加混乱。我觉得 OP 的图片很难看出实际上没有“列”,他有一个数组数组,每个数组都有不同的长度,“列”没有意义在这里。
【解决方案2】:

您应该能够相当容易地获得行长度,因为这只是您的数组数组中单个数组的长度。例如:arrays[3].length 将是 8。

列是不同的,因为我们需要关于每个数组的信息。我们可以遍历,计算长度大于您要查找的列号的数组的数量。

public static int getColumnLength(int[][] arrays, int columnNumber) {
  int count = 0;
  for(int i = 0; i < arrays.length; i++) {
    if (arrays[1].length > columnNumber) {
      count++;
    }
  }
}

【讨论】:

    【解决方案3】:

    使用 LINQ!

    public static int GetColumnSize<T>(this T[][] array, int columnNumber) =>
        array
        .Where(subArray => subArray.Length > columnNumber)
        .Count();
    
    public static int GetRowSize<T>(this T[][] array, int rowNumber) =>
        (array.Length <= rowNumber)
            ? array[rowNumber].Length
            : 0;
    

    【讨论】:

    • 注意,你真的应该检查空数组或负索引。
    【解决方案4】:

    我的任务是溢出列,例如,如果我在位置 [2][2](数字 9)并且当用户键入“向上走 4 步”时,我需要从列的另一侧输入并且转到图像上的元素 [4][2](编号 15)。 我有以下溢出方法:

    static int index(int i, int n)
    {
       return i % n < 0 ? n + (i % n) : i % n;
    }
    

    其中 i 是当前位置,n 是列/行的长度

    【讨论】:

    • 考虑让你的代码可读而不是超级紧凑。使用正确的变量名称和结构使您的代码更容易理解。例如,函数名“index”并没有告诉我关于这个函数的任何信息,参数“i”和“n”没有任何意义。
    • 当我的当前索引超出数组范围时,方法索引返回新索引。变量“i”是我的 currentIndex,变量“n”是数组的长度。
    • 我不是在寻求解释,只是提供一条建议:)
    • 这确实是一个与原始问题不同的问题。
    猜你喜欢
    • 2023-04-06
    • 2021-06-22
    • 2015-08-05
    • 2015-08-14
    • 2017-07-28
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多