我觉得这个任务不应该这样做......
我的sequenceY
长度不等于蒸汽数量,因为你不能将int [] length赋值为int,其中0为起始值。
因此我的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]);
}
答案 0 :(得分:4)
部分代码审核以及答案。
但它不起作用......为什么?
该代码无效,因为您将 sequenceY
重新分配给全新的值。
我的另一个问题是程序员如何处理长度未知的序列?
所以,知道我们可以在这里做一些事情:创建一个数组并使用Array.Resize
,使用List<T>
,填充初始数组,然后将其交换为正确大小之一,即填充。
我将假设一个“蒸汽”号码是偶数。
您的命名效果不佳:nizx
和nizy
没有表达意思或排列问题。
我将演示最后一个选项(因为你声明你不知道如何在这个类中使用.NET的许多中等复杂部分),这很好) :填充初始数组并将其换成新数组。这将在O(n^2)
时间(sorta)中运行。
所以,让我们从源数组开始。
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
包含{{1我们必须缩小它或什么。
steamNumbers
现在int[] tempSequenceY = sequenceY;
sequenceY = new int[steamNumbers];
for (int i = 0; i < steamNumbers; i++)
{
sequenceY[i] = tempSequenceY[i];
}
只有你的蒸汽号码。
最终代码:
sequenceY
你也可以很容易地将它提取到一个方法:
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;
}
当然,对于更高级的用户(这不会帮助你,但它可以帮助其他人)我们可以使用LINQ执行以下操作:
int[] steamNumbers = GetSteamNumbers(20, 1, 30);
哪个应该具有相同的效果。 (只是证明C#中仍然存在未来的事情。)
免责声明:我在IDE之外写了这个完整的答案而没有实际编译它,我不保证代码的准确性,但程序本身应该是相当直接的。
答案 1 :(得分:2)
C#中的数组是它们具有固定大小。 您必须迭代并重新创建它或使用具有动态大小的IEnumerable,例如列表。
此处的解决方案是使用包含整数的List,然后使用nizx.Add(rnd.Next(1,30));
答案 2 :(得分:1)
详细说明上面的评论:您可以通过在字符串中连接所需的值来创建“假”列表,以逗号分隔。 string.Split(',')将为您提供所需的结果数组。
给定一个形式为“a,b,c,d”的字符串string.Split(',')将创建数组[“a”,“b,”c“,”d“]。代码:< / p>
{
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]);
}
}