将特定数字从一个序列添加到另一个序列
Adding specific numbers from one sequence to another
我觉得这个任务不应该这样完成...
我的 sequenceY
长度不等于 steam 数字的数量,因为你不能用 0 作为起始值的 int 分配 int[] 长度。
因此我的 sequenceY
里面有很多 0,我无法打印整个序列。我什至尝试在 for 循环之后添加这个:
sequenceY = new int[steamnumbercounter];
但是没有用...为什么?
我的另一个问题是程序员如何处理长度未知的序列?
我设法只打印了 steam 号码,但任务说打印 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]);
}
C# 中数组的特点是它们的大小是固定的。
您必须遍历并重新创建它或使用具有动态大小的 IEnumerable,例如列表。
这里的解决方案是使用包含整数的列表,然后使用 nizx.Add(rnd.Next(1, 30));
详细说明我上面的评论:您可以通过在字符串中连接所需的值来创建 'fake' 列表,并用逗号分隔。 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]);
}
}
部分代码审查和答案。
But it didn't work ... Why ?
该代码无效,因为您正在重新分配 sequenceY
一个全新的 值。
My other question is how do programmers deal with sequences that have unknown length?
因此,有了这些知识,我们可以在这里做一些事情:创建一个数组并使用 Array.Resize
,使用 List<T>
,填充初始数组,然后将其交换为合适的大小之一已满
我假设 "steam" 是偶数。
你的命名不好:nizx
和nizy
没有表达意思或符合问题。
我将演示最后一个选项(因为您声明您不知道如何在此 class yet, which is fine): 填充初始数组并将其交换为新数组。这将在 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 之外编写了整个答案,并没有实际编译它,我不保证代码的准确性,但过程本身应该相当简单。
我觉得这个任务不应该这样完成...
我的 sequenceY
长度不等于 steam 数字的数量,因为你不能用 0 作为起始值的 int 分配 int[] 长度。
因此我的 sequenceY
里面有很多 0,我无法打印整个序列。我什至尝试在 for 循环之后添加这个:
sequenceY = new int[steamnumbercounter];
但是没有用...为什么?
我的另一个问题是程序员如何处理长度未知的序列?
我设法只打印了 steam 号码,但任务说打印 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]);
}
C# 中数组的特点是它们的大小是固定的。 您必须遍历并重新创建它或使用具有动态大小的 IEnumerable,例如列表。
这里的解决方案是使用包含整数的列表,然后使用 nizx.Add(rnd.Next(1, 30));
详细说明我上面的评论:您可以通过在字符串中连接所需的值来创建 'fake' 列表,并用逗号分隔。 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]);
}
}
部分代码审查和答案。
But it didn't work ... Why ?
该代码无效,因为您正在重新分配 sequenceY
一个全新的 值。
My other question is how do programmers deal with sequences that have unknown length?
因此,有了这些知识,我们可以在这里做一些事情:创建一个数组并使用 Array.Resize
,使用 List<T>
,填充初始数组,然后将其交换为合适的大小之一已满
我假设 "steam" 是偶数。
你的命名不好:nizx
和nizy
没有表达意思或符合问题。
我将演示最后一个选项(因为您声明您不知道如何在此 class yet, which is fine): 填充初始数组并将其交换为新数组。这将在 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 之外编写了整个答案,并没有实际编译它,我不保证代码的准确性,但过程本身应该相当简单。