使用我自己的方法添加两个数组。

时间:2016-11-15 01:21:03

标签: c# arrays methods

我正在制作一个带有2个数组并将它们加在一起的方法。 (我是一个新手,这是一个学校作业,我已经了解到有些人不喜欢在这里看到学校的问题。但我已经做了很多工作,我现在只是被卡住了。)

public static int[] Concat(int[] array1, int[] array2) //array1 = 1, 2, 3, 4, 5 array2 = 6, 7, 8, 9, 10.
    {
        int i = array1.Length + 1;
        int[] array3 = new int[array1.Length + array2.Length];
        Class1.CopyTo(array1, array3, 0);
        Class1.CopyTo(array2, array3, i);
        Class1.PrettyPrint(array3);
        return array3;
    }

在这个方法中我指的是我之前做过的其他两种方法:

public static int[] CopyTo(int[] arr1, int[] arr2, int start)
    {

        for(int i = 0; i < arr1.GetLength(0); i++)
        {
            if (start <= i)
            {
                arr2[i] = arr1[i];
            }
        }
        return null;
    }

这个用于将数组的索引复制到另一个数组中。 start变量是我首先开始复制的索引。

public static int[] PrettyPrint(int[] intArray)
    {
        string result = string.Join(", ", intArray);
        Console.WriteLine(result);
        return null;
    }

这会在字符串中打印出一个数组。

问题在于Concat方法。它适用于第一个副本。我将array1复制到array3。

Class1.CopyTo(array1, array3, 0);

但是对于第二个数组,它没有添加任何内容,而且只需输入字符串即可得到:

1,2,3,4,5,0,0,0,0,0。

我不明白为什么只有第一份副本才有效。

也是一个跟进问题。 在我的主程序选项卡中,我无法再使用类Class1 lab2 = new Class1();的实例引用这些方法。但是我不得不通过使用Class1而不是lab2(它适用于我的其他方法)来调用它们。 为了能够在同一个类中的另一个方法内调用一个方法,我必须添加“static”,并且通过添加“static”,我不得不改变我在主程序选项卡中调用方法的方式。 我真的不明白为什么我必须首先添加“静态”,然后改变我调用方法的方式。为什么我必须更改被调用为静态的2个方法?为什么我不能用实例lab2调用那些改变的方法?

很抱歉这个问题很长!

2 个答案:

答案 0 :(得分:1)

您没有复制第二个数组的原因是因为CopyTo方法仅在arr2时检查并复制到i >= start,这在start时不会发生}大于arr1长度,这是第二个数组array2的情况。

您必须进行2次更改才能使其正常工作:

Concat方法中的

1:,将+ 1移至int i = array1.Length + 1;(第二个CopyTo的起始参数)。你没有任何额外的整数:

public static int[] Concat(int[] array1, int[] array2) //array1 = 1, 2, 3, 4, 5 array2 = 6, 7, 8, 9, 10.
{
    int i = array1.Length; // + 1;
    int[] array3 = new int[array1.Length + array2.Length];
    Class1.CopyTo(array1, array3, 0);
    Class1.CopyTo(array2, array3, i);
    Class1.PrettyPrint(array3);
    return array3;
}
CopyTo

2:,删除循环内的if语句,然后使用arr2添加到start进行调整,像这样复制到arr2的正确索引:

public static int[] CopyTo(int[] arr1, int[] arr2, int start)
{

    for (int i = 0; i < arr1.GetLength(0); i++)
    {
        arr2[start + i] = arr1[i];

        /*if (start <= i)
        {
            arr2[i] = arr1[i];
        }*/
    }
    return null;
}

现在你得到了正确的结果数组: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

修改

对于您的后续问题,您不能直接向类调用任何方法,除非这些方法是静态方法。您必须创建并初始化类的对象以调用常规方法。 Class1是您的班级,lab2Class1班级的对象。您可以将常规方法调用到对象lab2,但不能将方法调用到其类Class1,除非这些方法是静态定义的。有关静态方法的更多信息,请查看以下链接:

Java: when to use static methods

Static Classes and Static Class Members (C# Programming Guide)

答案 1 :(得分:0)

您还可以使用两个索引,一个是sourceIndex,另一个是targetIndex。这将大大简化事情

插图:

public static int[] CopyTo(int[] arr1, int[] arr2, int startSource, int startTarget)
        {
            int index = startTarget;
            for (int i = startSource; i < arr1.GetLength(0); i++)
            {     
               arr2[index++] = arr1[i];   
            }
            return null;
        }

 public static int[] Concat(int[] array1, int[] array2) //array1 = 1, 2, 3, 4, 5 array2 = 6, 7, 8, 9, 10.
        {
            int i = array1.Length + 1;
            int[] array3 = new int[array1.Length + array2.Length];
            Class1.CopyTo(array1, array3, 0,0);
            Class1.CopyTo(array2, array3, 0, array1.Length);
            Class1.PrettyPrint(array3);
            return array3;
        }

        // Unchanged
        public static int[] PrettyPrint(int[] intArray)
        {
            string result = string.Join(", ", intArray);
            Console.WriteLine(result);
            return null;
        }

enter image description here