我正在尝试在Java中反转一个int数组。
该方法无法反转数组。
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
它有什么问题?
我正在尝试在Java中反转一个int数组。
该方法无法反转数组。
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
它有什么问题?
要反转一个int数组,你需要交换项直到达到中点,像这样:
for(int i = 0; i < validData.length / 2; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
你目前的做法是每个元素都交换两次,因此结果和初始列表相同。validData.length / 2
部分放到for循环的外面。 - Jin KwonvalidData.length >> 1
。这等效且更快,但会让很多程序员感到困惑,而任何一个好的编译器都会自动执行该操作。 - JustinvalidData.length - i - 1
并将其保存到一个变量中。 - user2258887使用Commons.Lang,你可以简单地使用
ArrayUtils.reverse(int[] array)
大多数情况下,使用已经过单元测试和用户测试的易于获取的库来解决问题可以更快速且更不容易出错。
private int[] reversed(int[] array) {ArrayUtils.reverse(array);}
,然后你就可以这样使用 f(reversed(arr));
:)) - CoderCollections.reverse(Arrays.asList(yourArray));
java.util.Collections.reverse()
可以反转 java.util.List
和 java.util.Arrays.asList()
返回一个包装了传递给它的特定数组的列表,因此在调用 Collections.reverse()
后,yourArray
就被反转了。
这种方法只需要创建一个 List 对象,不需要添加额外的库。
Tarik 和他们的评论员已经提出了类似的解决方案,但我认为这个答案更简洁、更易于理解。
int[]
传递给asList(...)
将不会返回一个List<Integer>
,而是一个包含一个元素的List<int[]>
。目前似乎没有简单内置的方法将int[]
转换为Integer[]
。 - Martin RustArrays.stream(arr).boxed().collect(Collectors.toList())
或 Arrays.stream(arr).boxed().toArray(Integer[]::new)
- Simon Forsbergpublic class ArrayHandle {
public static Object[] reverse(Object[] arr) {
List<Object> list = Arrays.asList(arr);
Collections.reverse(list);
return list.toArray();
}
}
int[]
不同于 Integer[]
。尝试一下:Integer[] array = new int[5]
。你会得到一个编译错误。这就是为什么 Java 的 Arrays
类定义了一堆用于处理原始数组的方法。试图将 int[]
传递给上述方法将导致类似于 The method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
的东西。对于原地算法,使用的内存较少且运行速度更快。 - Brian McCutchonArrays.asList()
返回的列表不引用原始数组,返回的数组也是如此。这个方法的一个问题就是它使用三倍的内存,并且需要三倍的工作来完成一个原地算法的任务。 - Brian McCutchonint[]
作为参数传递给这个方法(*"incompatible types: int[] cannot be converted to Object[]"*)。 - MC Emperor我认为,如果您在循环的每次迭代中声明显式变量来跟踪要交换的索引,那么就更容易理解算法的逻辑。
public static void reverse(int[] data) {
for (int left = 0, right = data.length - 1; left < right; left++, right--) {
// swap the values at the left and right indices
int temp = data[left];
data[left] = data[right];
data[right] = temp;
}
}
我也认为用while循环来完成这个操作更易读。
public static void reverse(int[] data) {
int left = 0;
int right = data.length - 1;
while( left < right ) {
// swap the values at the left and right indices
int temp = data[left];
data[left] = data[right];
data[right] = temp;
// move the left and right index pointers in toward the center
left++;
right--;
}
}
这里已经有很多答案了,主要集中在原地修改数组。但是为了完整性,这里提供另一种方法,使用Java流来保留原始数组并创建一个新的翻转数组:
int[] a = {8, 6, 7, 5, 3, 0, 9};
int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();
Collections.reverse
是一个 void 方法。它在一个 Guava 内部类上原地操作,该内部类包装了一个 int[]
(由于它从不存储装箱的 Integer
列表,因此我不会称该类为 "boxed list",而是称其为 "数组的列表视图")。但是,是的,它通过传递 Integer
对象来操作接口,因此这将创建大量临时对象和装箱,如上所述。在需要性能的地方,请尝试使用 IntStream
或基本集合库(Trove、Koloboke、Eclipse Collections 等)。 - Luke Usherwood如果使用 Java 8,我们可以使用IntStream
来反转整数数组,如下所示:
int[] sample = new int[]{1,2,3,4,5};
int size = sample.length;
int[] reverseSample = IntStream.range(0,size).map(i -> sample[size-i-1])
.toArray(); //Output: [5, 4, 3, 2, 1]
for(int i=validData.length-1; i>=0; i--){
System.out.println(validData[i]);
}
简单的for循环!
for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
int aux = array[start];
array[start]=array[end];
array[end]=aux;
}