如何使两个数组具有不同的引用?

q5lcpyga  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(379)

我必须反转两个数组,这样,它们都有相同的值,但引用不同。
这是我目前的代码。
但是当两个数组都指向相同的程序参数时,如何实现这一点呢?
为什么呢 String[] 参考反转 String[] 值而不是反转程序参数?
例如。如果程序参数 1 2 3 4 5 :

String[] values = 5 4 3 2 1
String[] reference = 1 2 3 4 5
public static void main(String[] args) {
    String[] values = changeValues(args);
    System.out.println(Arrays.toString(values));
    String[] reference = changeReference(args);
    System.out.println(Arrays.toString(reference));

    if (!testSameValues(values, reference)) {
        System.out.println("Error: Values do not match !");
    }

    if (testSameReference(values, reference)) {
        System.out.println("Error: References are the same !");
    }
}
public static String[] changeValues(String[] x) {
    for (int i = 0; i < x.length / 2; i++) {
        String temp = x[i];
        x[i] = x[(x.length - 1) - i];
        x[(x.length - 1) - i] = temp;
    }
    return x;
}

public static String[] changeReference(String[] y) {
    for (int i = 0; i < y.length / 2; i++) {
        String temp = y[i];
        y[i] = y[(y.length - 1) - i];
        y[(y.length - 1) - i] = temp;
    }
    return y;
}

public static boolean testSameValues(String[] x, String[] y) {
    if (x.equals(y)) {
        return true;
    } else
        return false;
}

public static boolean testSameReference(String[] x, String[] y) {
    if (x == y) {
        return true;
    } else
        return false;
}
k10s72fa

k10s72fa1#

您只需复制反向数组,即可获得两个具有相同内容的不同引用:

// original array
String[] arr1 = {"5", "7", "3", "2", "1"};

// reversed array
String[] arr2 = IntStream
        // iterating in reverse order
        .iterate(arr1.length, i -> i > 0, i -> i - 1)
        // get an element by its index
        .mapToObj(i -> arr1[i - 1])
        .toArray(String[]::new);

// copy of the reversed array
String[] arr3 = Arrays.stream(arr2).toArray(String[]::new);
System.out.println(Arrays.toString(arr2)); // [1, 2, 3, 7, 5]
System.out.println(Arrays.toString(arr3)); // [1, 2, 3, 7, 5]

System.out.println(arr2 == arr3); // false
System.out.println(Arrays.equals(arr2, arr3)); // true
System.out.println(Arrays.compare(arr2, arr3)); // 0

另请参见:用last交换第一个数组元素,用second-last交换第二个数组元素,依此类推

v1l68za4

v1l68za42#

反向方法只对输入数组进行操作,不创建新数组。编写一个方法来反转 String[] 并返回一个新数组。像这样的

private static String[] copyReverse(String[] arr) {
    String[] ret = new String[arr.length];
    for (int i = 0; i < arr.length; i++) {
        ret[i] = arr[arr.length - i - 1];
    }
    return ret;
}

然后你可以依次调用它。比如,

String[] values = copyReverse(args);
String[] reference = copyReverse(values);

我认为您需要两种方法,一种是复制数组,另一种是反转数组。让我们使这些方法成为泛型的,但是为了泛型地复制数组,我们还需要传递类。比如说,

private static <T> T[] copy(Class<T> cls, T[] arr) {
    T[] ret = (T[]) Array.newInstance(cls, arr.length);
    for (int i = 0; i < arr.length; i++) {
        ret[i] = arr[i];
    }
    return ret;
}

在原地反转数组时,如果在数组中的位置使用两个变量,我会发现更容易读取。比如,

private static <T> T[] reverse(T[] arr) {
    for (int i = 0, j = arr.length - 1; i < arr.length / 2; i++, j--) {
        T temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    return arr;
}

以及 copyReverse 一般来说,

private static <T> T[] copyReverse(Class<T> cls, T[] arr) {
    T[] ret = (T[]) Array.newInstance(cls, arr.length);
    for (int i = 0; i < arr.length; i++) {
        ret[i] = arr[arr.length - i - 1];
    }
    return ret;
}

复制 String[] 你们两个都可以

String[] values = copy(String.class, args);
String[] reversed = copyReverse(String.class, args);

但如果你用原地踏步 reverse 它修改传入的数组。

qrjkbowd

qrjkbowd3#

克隆阵列:

String[] values = changeValues(args.clone());
String[] reference = changeReference(args.clone());

注意,自从 changeValues 以及 changeReference 做同样的事,你可以用 changeValues 两者或 changeReference 两个都是。数组在内存中的位置基于传入数组的位置,而不是函数名。

0md85ypi

0md85ypi4#

changereference和changevalues方法执行相同的操作—反转数组。这就是为什么最后会看到相同的输入数组。
要更改引用,需要创建一个新数组,并使用与原始数组相同的元素填充它。
编辑:将数组复制到新数组中

public static String[] changeReference(String[] y) {
    String[] copy = new String[y.length];
    for(int i = 0; i < y.length; i++) {
        copy[i] = y[i]
    }
    return copy;
}

相关问题