是否可以在不使用返回类型的情况下连接两个int数组?

时间:2014-10-25 23:38:11

标签: java arrays

我正在处理的这个特殊问题如下:

ConcatArrays(int [] listA,int [] listB,int [] listC),没有返回类型。 1.该方法传递正式数组参数listA和listB,然后返回连接数组listC。 2. listC的第一部分包含与listA的相应元素相同的元素,第二部分包含与listB相同的元素。 listC的长度是listA.length + listB.length。

这就是我所拥有的,显然它无法发挥作用。甚至可以在没有返回类型/删除列表c作为第三个参数的情况下执行此操作吗?

  public static void  ConcatArray(int[] listA, int[] listB, int[] listC) 
    {
         int aLen = listA.length ; 
         int bLen = listB.length;
         int cLen = listC[aLen + bLen];
    }

编辑:我很欣赏所有人的答案,我投了他们所有人。这是一个家庭作业,重新阅读之后,我相信不返回类型是一个错误,因为他在问题1中说了什么。基本上说通过使用参数listB和ListA返回列表c。之前还有其他一些错别字,因为他已经纠正过了。他还为我们的测试类提供了array1和array2,但是没有数组3。

3 个答案:

答案 0 :(得分:5)

创建Java数组后,您无法更改其大小。您的代码不起作用,因为数组引用是按值传递的,而Java没有通过引用传递。

返回数组是在Java中解决这个问题的惯用方法:

public static int[]  ConcatArray(int[] listA, int[] listB) {
    int[] res = new int[listA.length + listB.length];
    ...
    return res;
}

您可以通过具有所需类型字段的可变类型伪造传递引用,如下所示:

class IntArrayRef {
    int[] array;
}

现在您可以像这样编写void方法:

public static void  ConcatArray(int[] listA, int[] listB, IntArrayRef res) {
    res.array = new int[listA.length + listB.length];
    ...
}

但是,如果你经历了这样做的麻烦,你也可以返回数组。

答案 1 :(得分:1)

诀窍是知道数组的内容不是传递给方法的内容。可以读取和写入数组的内容,但写入一个更改原始内容。除非你自己创新,否则Java不会为你制作新的副本。这意味着您可以通过简单地涂抹传递给您的信息来传回信息。只要你记录下这种行为就行了,所以当他们的数据再见时,使用这种方法的人并不感到惊讶。

public static void main(String[] args)
{
    int[] a = {0, 1};
    int[] b = {2, 3};
    int[] c = new int[a.length + b.length];

    concatArray(a, b, c);

    for (int i : c)
    {
        System.out.println(i);
    }
}

/** Concatenates prefix and suffix into result which must be as large as both */
public static void concatArray(int[] prefix, int[] suffix, int[] result) 
{
     int prefixLength = prefix.length; 
     int suffixLength = suffix.length;

     if( result.length < prefixLength + suffixLength)
     {
         throw new IllegalArgumentException();
     }

     for (int i = 0; i< prefixLength; i++)
     {
         result[i] = prefix[i];
     }

     for (int i = 0; i< prefixLength; i++)
     {
         result[i+prefixLength] = suffix[i];
     }
}

输出:

0
1
2
3

只要它们不是不可变的,这个同样的技巧适用于对象。如果有人递给你一个豆子,你可以自由地玩它的安装者,如果你不应该这样做,会造成各种各样的破坏。

这就是为什么将数组或对象的标识符设置为final是不能保证不变性的原因。任何人仍然可以调用设置方法(如果它们存在于对象上)或者在数组中进行新的赋值。所有final都是将对象或数组手铐到标识符。它没有锁定公文包&#39;。摆脱二传手锁定公文包。

我们称之为不可变的。字符串是不可改变的,这就是为什么这个技巧不能与字符串一起使用的原因。

当你传递给一个方法时,就像你最终确定了标识符一样。您无法更改数组或对象,而调用上下文无法跟踪您正在播放的内容。如果您坚持使用相同的数组或对象,您可以尽可能多地使用它,并且调用上下文将看到您所做的任何事情。

事实上,每当你返回原始文件以外的任何内容时,你真正返回的是一个新位置并说:&#34;看看我在这里做了什么&#34;。这个技巧只需坚持以前已知的位置即可。

答案 2 :(得分:0)

实际上,没有人使用Simple Array,因为你无法调整它,或者添加/删除。大多数程序员使用ArrayList类,因为它更灵活,更强大。

- 创建一个arraylist类的实例

        java.util.ArrayList<String> cities = new java.util.ArrayList<String>();

- 为你的arraylist添加一个变量

        cities.add("Alexandria");

- 在你的arraylist中获得一个可变位置

        cities.indexOf("Cairo"));

- 从你的arraylist中删除第一个变量(它基于零,就像简单数组一样)

        cities.remove(0);

- 获取你的arraylist的长度

        cities.size();

查看Java文档以获取有关ArrayList类的更多信息 http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html