【问题标题】:How can I reverse each row of numbers in this file in my array in c#如何在 c# 的数组中反转此文件中的每一行数字
【发布时间】:2012-11-30 00:12:34
【问题描述】:

编辑代码

包含我要反转的行的文本文件包含这些数字:

1 2 3 4 5 6 7 8 9 10  
11 12 13 14 15 16 17 18 19 20  
21 22 23 24 25 26 27 28 29 30  
31 32 33 34 35 36 37 38 39 40  
41 42 43 44 45 46 47 48 49 50  
51 52 53 54 55 56 57 58 59 60  
61 62 63 64 65 66 67 68 69 70  
71 72 73 74 75 76 77 78 79 80  
81 82 83 84 85 86 87 88 89 90  
91 92 93 94 95 96 97 98 99 100  

到目前为止,我的数组如下所示:

 static void Main()
    {            
            int numbers;

            StreamReader fileReader = new StreamReader(fileDirectory);
            string line  = fileReader.ReadLine();
            fileReader.Close();
            string[] Split = line.Split();
            int.TryParse(line, out numbers);

            int[,] Table = new int [10,10];

                for (int row = 0; row < Table.GetUpperBound(0); row++)
                {
                    for (int column = 0; column < Table.GetUpperBound(0); column++)
                    {

                    }
                }


                for (int row = 0; row < Table.GetUpperBound(0); row++)
                {
                    for (int column = 0; column < Table.GetUpperBound(0); column++)
                    {
                        int tempHolder = Table[row, column];
                        Table[row, column] = Table.GetUpperBound(0);
                        Table[row, Table.GetUpperBound(0) - column] = tempHolder;
                        Console.WriteLine(Table[row, column]);
                        Console.Write(" ");
                    }
                    Console.WriteLine();
                }Console.Write(" ");
        }

您能帮我将 int numbers 变量添加到数组中,然后我将尝试反转。现在,如果我运行它,我会得到大约 24 行的数字 9。还有人可以告诉我如何做一个 2d 数组而不必指定它的大小吗?我在网上看过,但不知道怎么做。谢谢

【问题讨论】:

  • 简单的解决方案是计算有多少行。根据该信息创建一个正确大小的数组,并向后循环遍历空数组。我建议您尝试这种方法并根据该代码提出任何问题。您甚至不会尝试填充数组。
  • 我 ninja 编辑了评论以排除大约 10 x 10 的 cmets,因为 mnel 的编辑说明了这一点。当然,您将面临的问题是创建正确大小的数组。这个问题当然有解决办法。您只需使用整数数组即可。
  • 如果您尝试反转每行或整个文件的数字,我不清楚。如果是每一行,那么您不需要像@Ramhound 建议的那样计算行数。在line = fileReader.ReadLine() 之后,只需按空格分割行,将其放入数组中并向后读取数组
  • 我想我应该发布我的填充尝试,但我尝试了许多不同的方法,但都失败了,这就是为什么我在这里寻求帮助,但我会在这个问题中提出我的最后一次尝试跨度>
  • 我正在尝试按每行反转数字

标签: c# arrays for-loop text-files reverse


【解决方案1】:

我认为这是家庭作业,所以我会给出一些建议,但不会真正提供代码。

首先,您必须拆分每一行以获得代表每个数字的字符串列表。
之后,您需要将每个数字的字符串表示形式转换为整数。
那么循环并将每个 int 添加到数组中应该不会太难。
您需要在处理一行时跟踪当前的水平索引,以及所有行的垂直索引。

在那之后你应该更接近。尝试进行逆转,如果再次遇到问题,请返回。

编辑:

为了创建数组,您可以从 int 变量中指定大小。如果您有String[] lines(每行一个)和String[] linelines 中的一行由空格字符分隔),您可以像这样声明数组:

int[,] table = new int[line.Length, lines.Length];

您已经非常接近此代码了。
对于 String.Split,你需要告诉它哪个字符分隔你想要的元素:

String[] split = line.Split(' ');

这需要对文件中的每一行执行一次,因此应将其移到外循环内。同样,int.TryParse 需要对每个数字执行一次,所以它应该在内部循环中。

int number;
if (int.TryParse(split[column], out number))
{
    table[column, row] = number;
}

您还应该注意您的GetUpperBound 电话。 GetUpperBound(d) 返回GetLength(d) - 1,因此您需要在索引小于或等于GetUpperBound 时循环。您还可以将GetUpperBound 调用替换为GetLength(0)(列)和GetLength(1)(行)。
传递给 GetUpperBoundGetLength 的数字是您想要获取大小的方向。您将 0 传递给所有这些,除非数组是正方形,否则这将不起作用。

在反向循环中,内部循环的第二行出现错误。您将 Table[row, column] 设置为数组的大小,而不是要交换的元素。您也只需要循环到每行的中间,否则您只需将元素交换回后半部分的原始位置。

【讨论】:

  • 谢谢,今天我尝试了很多不同的解决方案超过 11 个小时,但都失败了。我是数组的新手,我发现很难完全理解,但我会在早上尝试一下,因为现在是 00:30
  • @user1849989 不用担心。当您感到沮丧/疲倦时,尝试工作弊大于利。稍后我将根据发布的新代码扩展此答案。
  • @user1849989 - 编程很难。有些问题需要几天、几周甚至几个月的时间。这个问题没那么复杂。我建议你把问题分解,在纸上弄清楚,然后写你的代码。你会如何自己扭转这样的事情?写下解决问题的每一步,这是你解决问题的第一步。
  • 我已经对我的代码做了一些更改,一旦我开始工作,我会尝试 try 和 catch 但是你们能帮我将 int 数字添加到数组中,就像在数组中将有 10 x 10。还有一件事,你能告诉我一个如何拥有一个二维数组而不必指定它的大小的例子。
  • @user1849989 我添加了更多信息。希望这可以帮助您完成剩下的工作,但如果您有更多问题,我会稍后再回来查看。
【解决方案2】:

我会给你更多的提示、技巧并提供一些代码。

1..您需要将文本文件中的值放入数组中

string arrayLine = "";

try
{
    StreamReader fileReader = new StreamReader("C:\\Numbers.txt");
    string line = fileReader.ReadLine();

    while (line != null)
    {
        Console.WriteLine(line);

        if (arrayLine != "")
        {
             arrayLine += " " + line; // Add the rest of the number lines together
        }
        else
        {
             arrayLine = line;  // Add the first line
        }

        line = fileReader.ReadLine();    
    }
    fileReader.Close();
} 
catch (IOException IOEx)
{
    throw new Exception("no file found");
}
catch (Exception ex)
{
    throw new Exception("Other Exception found");
}

// Add the numbers into an array
int[] myNumberArray = SplitStringToNumbersArray(arrayLine);

将字符串拆分为数组的方法如下

static private int[] SplitStringToNumbersArray(string _Numbers)
{
    _Numbers = _Numbers.Replace("  ", " "); 
    string[] pieces = _Numbers.Split(' ');
    int[] ret = new int[pieces.Length];
    for (int i = 0; i < pieces.Length; i++)
    {
        ret[i] = int.Parse(pieces[i]);
    }
    return ret;
}

2.. 你想反转数组。这是一个例子和信息

Reverse an Array in C#

3.. 数组已经反转,所以现在您要遍历数组(从第 99 个位置开始并递减)并在每行添加 10 个数字。我给你它的骨架代码,你可以填写其余的

string result = ""; // Used as the temporary string

for (int i = (reversedArray.Length-1); i > -1; i--)
{
    if ((i % 10 == 0))
    {
        // this is the 10th number you are adding to the string
        // This string is complete, What should you do now? 
    }
    else
    {
        // Keep adding to the string  
    }
}

// You have completed it so add the next line so you can see the result
Console.ReadLine();

【讨论】:

  • 我没有投反对票,但是您可以在不硬编码数组大小的情况下使您的最后一个算法工作。如果添加另一行会发生什么?现在你必须重新编译并且不需要。
  • @JamesD'Angelo 好点。我已更新答案以反映您的建议
  • 另外,只是一个挑剔,但你假设换行符应该每 10 个字符后跟 - 另一件事你必须改变。但是,有了变化,好多了。 =)
  • @JamesD'Angelo 他们都是有效的观点 :) 我想我只是想快速提出一个答案,这样它就可以帮助 OP。为抽出时间发表评论而欢呼
  • 不用担心。就像我说的,只是挑剔。为您的修复提供 +1 以帮助您收支平衡。 =)
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多