我试图使用我用来反转数组的代码。我不明白为什么我在控制台中输出[I@7a84639c
作为输出。
由于某些原因,为什么这个方法实际上没有将我的反向数组保存到数组中?如果我在x[i]=c[i];
的底部添加一个打印件,它会显示相反的数组,但是当我添加一个例如karn[0]
的调用时,它表明我的数组实际上没有反转。我想通过坚持我所做的代码来解决这个问题。
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[]karn={1,2,3};
rev(karn);
System.out.println(karn.toString());
}
public static void rev(int[]x){
int[]c=new int[x.length];
for(int i=x.length-1;i>-1;i--){
c[i]=x[i];
x[i]=c[i];
}
}
}
答案 0 :(得分:2)
在rev
方法中,您正在使用c的局部变量。因此,此值不会转移到您的main方法。您必须返回数组并将值分配给旧数组:
public static int[] rev(int[]x){
//Creates new array this array is different from karn and local to the method.
//nothing outside of this method can see this array.
int[]c=new int[x.length];
for(int i = 0; i < c.length; i++){
//Here is where we are swapping the values by placing the first
//value at the last spot of the array and so on
c[c.length - i - 1] = x[i];
}
//we must return the new array we made and assign it to karn so our
//changes will be saved and seen outside of the method
return c;
}
在main方法中,您必须将rev
方法的更改分配给karn。您可以指定值并将其显示如下:
karn = rev(karn);
//for each loop
for(int i : karn)
System.out.println(i);
//traditional for loop
for(int i = 0; i < karn.length; i++)
System.out.println(karn[i]);
数组没有默认的toString()
方法。这就是为什么你可以按照自己的意愿看到数组的值。您需要遍历数组以将其显示到控制台。
答案 1 :(得分:1)
您的初始方法看起来几乎正确,您可以就地或通过副本执行此操作。我发布了一个显示副本的评论,所以我想我可能会就地扩展。我将从一个简单的交换方法开始,比如
private static void swap(int[] x, int i, int j) {
if (i != j) {
int t = x[i];
x[i] = x[j];
x[j] = t;
}
}
然后你只需要迭代数组的前半部分,用相同的索引交换每个元素(但是从另一半交换)。像,
public static void rev(int[] x) {
for (int i = 0; i < x.length / 2; i++) {
swap(x, i, x.length - i - 1);
}
}
然后你可以称之为
public static void main(String[] args) throws IOException {
int[] karn = { 1, 2, 3 };
rev(karn);
System.out.println(Arrays.toString(karn));
}
输出
[3, 2, 1]