【问题标题】:Adding specific numbers from one sequence to another将特定数字从一个序列添加到另一个序列
【发布时间】:2016-12-26 13:45:58
【问题描述】:

我觉得这个任务不应该这样完成……

我的sequenceY 长度不等于蒸汽编号的数量,因为您不能将 int[] 长度分配给以 0 作为起始值的 int。 因此,我的sequenceY 里面有很多 0,我无法打印整个序列。我什至尝试在 for 循环之后添加这个:

sequenceY = new int[steamnumbercounter];

但它不起作用......为什么?

我的另一个问题是程序员如何处理长度未知的序列?

我设法只打印了蒸汽号码,但任务说打印sequenceY不仅仅是它的一部分。

// 4. sequenceX[20] is made of random numbers from 1 to 30 , 
// sequenceY is made of steam numbers from sequenceX. Print sequneceY.

int[] nizx = new int[20];
int[] nizy = new int[20];
int n = 0;
int steamnumbercounter = 0;
Random rnd = new Random();

for (int i = 0; i < nizx.Length; i++)
{
    nizx[i] = rnd.Next(1, 30);
    if (nizx[i]%2==0)
    {
        nizy[n] = nizx[i];
        n++;
        steamnumbercounter++;
    }

    Console.Write("{0} , ", nizx[i]);
}

for (int i = 0; i < steamnumbercounter; i++)
{
    Console.WriteLine("{0} , ",nizy[i]);
}

【问题讨论】:

  • 使用 System.Collections.Generic.List 代替 nizy 的数组。
  • 是的,我也这么认为,但是因为这些任务是针对我的课程的,而且我们还没有研究过列表,所以我认为我不应该在这里使用列表。
  • 那么你学到了什么,你现在可以使用?数组、字符串?
  • 是的,数组、字符串和循环。
  • 在这种情况下,您可以通过在字符串中连接您需要的值来创建一个“假”列表,用逗号分隔。 string.Split(',') 将为您提供所需的结果数组。

标签: c# sequence


【解决方案1】:

部分代码审查以及答案。

但它不起作用......为什么?

该代码不起作用,因为您要重新分配 sequenceY 到一个全新的值。

我的另一个问题是程序员如何处理长度未知的序列?

因此,知道了这一点,我们可以在这里做一些事情:创建一个数组并使用 Array.Resize,使用 List&lt;T&gt;,填充初始数组,然后将其交换为已填充的正确大小之一。

我将假设“蒸汽”数字是偶数。

你的命名不好:nizxnizy没有传达意思或与问题对齐。

我将演示最后一个选项(因为您说您还不知道如何在此类中使用 .NET 的许多适度复杂部分,这很好) : 填充初始数组并将其换成新数组。这将在O(n^2) 时间运行(排序)。


那么,让我们从源数组开始吧。

int[] sequenceX = new int[20];

接下来,我们将目标数组定义为与源数组相同的大小。 (这是其中可以存储的最大值数,我们稍后会缩小它。)

int[] sequenceY = new int[sequenceX.Length];

然后我们需要一个变量来保存我们找到的符合我们标准的数字:

int steamNumbers = 0;

最后,我们的Random

Random random = new Random();

然后,我们会像您一样查看我们所有的sequenceX,但我们会稍微更新一下逻辑。

for (int i = 0; i < sequenceX.Length; i++)
{
    sequenceX[i] = random.Next(1, 30);

    if (sequenceX[i] % 2 == 0)
    {
        sequenceY[steamNumbers] = sequenceX[i];
        steamNumbers++;
    }
}

所以我们的代码看起来几乎和你的一样,但是我们还有一件事要做:因为你希望sequenceY包含steamNumbers,我们有缩小它什么的。

int[] tempSequenceY = sequenceY;
sequenceY = new int[steamNumbers];

for (int i = 0; i < steamNumbers; i++)
{
    sequenceY[i] = tempSequenceY[i];
}

现在sequenceY 里面只有你的 Steam 号码。

最终代码:

int[] sequenceX = new int[20];
int[] sequenceY = new int[sequenceX.Length];
int steamNumbers = 0;
Random random = new Random();

for (int i = 0; i < sequenceX.Length; i++)
{
    sequenceX[i] = random.Next(1, 30);

    if (sequenceX[i] % 2 == 0)
    {
        sequenceY[steamNumbers] = sequenceX[i];
        steamNumbers++;
    }
}

int[] tempSequenceY = sequenceY;
sequenceY = new int[steamNumbers];

for (int i = 0; i < steamNumbers; i++)
{
    sequenceY[i] = tempSequenceY[i];
}

// Print your `sequenceY` here.

你也可以很容易地将它提取到一个方法中:

public int[] GetSteamNumbers(int sequenceCount, int randomMinimum, int randomMaximum)
{
    int[] sequenceX = new int[sequenceCount];
    int[] sequenceY = new int[sequenceX.Length];
    int steamNumbers = 0;
    Random random = new Random();

    for (int i = 0; i < sequenceX.Length; i++)
    {
        sequenceX[i] = random.Next(randomMinimum, randomMaximum);

        if (sequenceX[i] % 2 == 0)
        {
            sequenceY[steamNumbers] = sequenceX[i];
            steamNumbers++;
        }
    }

    int[] tempSequenceY = sequenceY;
    sequenceY = new int[steamNumbers];

    for (int i = 0; i < steamNumbers; i++)
    {
        sequenceY[i] = tempSequenceY[i];
    }

    return sequenceY;
}

然后调用它:

int[] steamNumbers = GetSteamNumbers(20, 1, 30);

当然,对于更高级的用户(这对没有帮助,但它可能对其他人有帮助)我们可以使用 LINQ 执行以下操作:

var random = new Random();
var sequenceY = Enumerable.Range(1, 20)
                          .Select(x => random.Next(1, 30))
                          .Where(x => x % 2 == 0)
                          .ToArray();

应该有同样的效果。 (只是证明 C# 中还有一些值得期待的东西。)

免责声明:我在 IDE 之外编写了整个答案并且没有实际编译它,我不保证代码的准确性,但过程本身应该相当简单。

【讨论】:

  • 感谢您帮助我,我真的很感激。 :)
  • 感谢 lambda!和非常详细的帖子。这涵盖了所有内容!
【解决方案2】:

C# 中数组的特点是它们的大小是固定的。 您必须遍历并重新创建它或使用具有动态大小的 IEnumerable,例如 Lists。

这里的解决方案是使用包含整数的列表,然后使用 nizx.Add(rnd.Next(1, 30));

【讨论】:

  • 虽然技术上它们的大小是固定的,但您可以使用Array.Resize取消修复它们的大小(秘密创建一个新数组并将旧数组的相关部分复制到其中,但这是更多技术问题。
  • 完全正确:D!仍然,调整大小意味着计算大小!它不是动态的。
【解决方案3】:

详细说明我上面的评论:您可以通过在字符串中连接您需要的值来创建一个“假”列表,用逗号分隔。 string.Split(',') 将为您提供所需的结果数组。

给定一个 "a,b,c,d" 形式的字符串 string.Split(',') 将创建数组 ["a","b,"c","d"]。代码:

    {
        int[] nizx = new int[20];
        string numberString = string.Empty;
        int n = 0;
        Random rnd = new Random();

        for (int i = 0; i < nizx.Length; i++)
        {
            nizx[i] = rnd.Next(1, 30);
            if (nizx[i] % 2 == 0)
            {
                numberString += nizx[i] + ",";
                n++;
            }
        }

        var numberArray = numberString.Split(',');

        for (int i = 0; i < n; i++)
        {
            Console.WriteLine("{0} , ", numberArray[i]);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多