如何在Java中反转int数组?

我试图在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;
}

有什么问题吗?

651237 次浏览
public class ArrayHandle {
public static Object[] reverse(Object[] arr) {
List<Object> list = Arrays.asList(arr);
Collections.reverse(list);
return list.toArray();
}
}

反转一个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;
}

你这样做的方式是,你交换每个元素两次,所以结果与初始列表相同。

最有效的方法是向后迭代数组。

我不确定Aaron的解决方案是否vi这个调用Collections.reverse(list);有人知道吗?

你的程序将只适用于length = 0, 1。 你可以试试:

int i = 0, j = validData.length-1 ;
while(i < j)
{
swap(validData, i++, j--);  // code for swap not shown, but easy enough
}

对于下议院。朗,您可以简单地使用

ArrayUtils.reverse(int[] array)

大多数情况下,当它们处理您的问题时,坚持使用已经经过单元测试和用户测试的易于使用的库会更快,而且更安全。

我认为如果你声明显式变量来跟踪你在每次循环迭代中交换的下标,那么遵循算法的逻辑会更容易一些。

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--;
}
}

如果使用更原始的数据(即char, byte, int等),那么你可以做一些有趣的异或操作。

public static void reverseArray4(int[] array) {
int len = array.length;
for (int i = 0; i < len/2; i++) {
array[i] = array[i] ^ array[len - i  - 1];
array[len - i  - 1] = array[i] ^ array[len - i  - 1];
array[i] = array[i] ^ array[len - i  - 1];
}
}
public void display(){
String x[]=new String [5];
for(int i = 4 ; i > = 0 ; i-- ){//runs backwards


//i is the nums running backwards therefore its printing from
//highest element to the lowest(ie the back of the array to the front) as i decrements


System.out.println(x[i]);
}
}
public static void main (String args[]){


//create  array
String[] stuff ={"eggs","lasers","hats","pie","apples"};


//print out  array
for(String x :stuff)
System.out.printf("%s ", x);
System.out.println();


//print out array in reverse order
for(int i=stuff.length-1; i >= 0; i--)
System.out.printf("%s ",stuff[i]);


}

这对你有帮助

int a[] = {1,2,3,4,5};
for (int k = 0; k < a.length/2; k++) {
int temp = a[k];
a[k] = a[a.length-(1+k)];
a[a.length-(1+k)] = temp;
}

这是我个人的解决方法。创建参数化方法的原因是允许对任何数组进行排序…不仅仅是整数。

我希望你能从中有所收获。

@Test
public void reverseTest(){
Integer[] ints = { 1, 2, 3, 4 };
Integer[] reversedInts = reverse(ints);


assert ints[0].equals(reversedInts[3]);
assert ints[1].equals(reversedInts[2]);
assert ints[2].equals(reversedInts[1]);
assert ints[3].equals(reversedInts[0]);


reverseInPlace(reversedInts);
assert ints[0].equals(reversedInts[0]);
}


@SuppressWarnings("unchecked")
private static <T> T[] reverse(T[] array) {
if (array == null) {
return (T[]) new ArrayList<T>().toArray();
}
List<T> copyOfArray = Arrays.asList(Arrays.copyOf(array, array.length));
Collections.reverse(copyOfArray);
return copyOfArray.toArray(array);
}


private static <T> T[] reverseInPlace(T[] array) {
if(array == null) {
// didn't want two unchecked suppressions
return reverse(array);
}


Collections.reverse(Arrays.asList(array));
return array;
}

这样做不是更不可能出错吗?

    int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] temp = new int[intArray.length];
for(int i = intArray.length - 1; i > -1; i --){
temp[intArray.length - i -1] = intArray[i];
}
intArray = temp;

下面是要在您的机器上运行的完整程序。

public class ReverseArray {
public static void main(String[] args) {
int arr[] = new int[] { 10,20,30,50,70 };
System.out.println("reversing an array:");
for(int i = 0; i < arr.length / 2; i++){
int temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}

用于使用数组这将是一个很好的来源的矩阵程序。通过链接。

private static int[] reverse(int[] array){
int[] reversedArray = new int[array.length];
for(int i = 0; i < array.length; i++){
reversedArray[i] = array[array.length - i - 1];
}
return reversedArray;
}

使用XOR解决方案来避免临时变量,您的代码应该是这样的

for(int i = 0; i < validData.length; i++){
validData[i] = validData[i] ^ validData[validData.length - i - 1];
validData[validData.length - i - 1] = validData[i] ^ validData[validData.length - i - 1];
validData[i] = validData[i] ^ validData[validData.length - i - 1];
}

请看这个链接来获得更好的解释:

http://betterexplained.com/articles/swap-two-variables-using-xor/

public class TryReverse {
public static void main(String[] args) {
int [] array = {2,3,4,5,6,7,8,9};
reverse(array);
for(int i=0; i<array.length; ++i)
System.out.print(array[i] + " ");
}
public static void reverse (int [] array){
for(int start=0, end=array.length-1; start<=end; start++, end--){
int aux = array[start];
array[start]=array[end];
array[end]=aux;
}
}
}

简单for循环!

for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
int aux = array[start];
array[start]=array[end];
array[end]=aux;
}

试试这个程序在JAVA:-

import java.util.Scanner;


public class Rev_one_D {


static int row;


static int[] trans_arr = new int[row];


public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
row = n;


int[] arr = new int[row];
for (int i = 0; i < row; i++) {


arr[i] = sc.nextInt();
System.out.print(arr[i] + " ");


System.out.println();
}


for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[i];
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = temp;


}


for (int i = 0; i < row; i++) {
System.out.print(arr[i] + " ");
System.out.println();
}
}
}
for(int i=validData.length-1; i>=0; i--){
System.out.println(validData[i]);
}

你可以用这个

public final class ReverseComparator<T extends Comparable<T>> implements  Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o2.compareTo(o1);
}
}

一个简单的

Integer[] a = {1,6,23,4,6,8,2}
Arrays.sort(a, new ReverseComparator<Integer>());

试试下面的代码:

    int arr[] = new int[]{1,2,3,4,5,6,7};
for(int i=0;i<arr.length/2;i++){
int temp = arr[i];
arr[i] = arr[(arr.length-1)-i];
arr[(arr.length-1)-i] = temp;
}
System.out.println(Arrays.toString(arr));
public void getDSCSort(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;
}
}

这里有一个简单快速的解决方案。希望能有所帮助!

public int[] reverse(int[] arr) {
for(int i = arr.length; i > 0 ; i--){
System.out.print(arr[i-1] + " ");
}
return arr;
}

下面是一个简单的实现,用于反转任何类型数组,并加上全部/部分支持。

import java.util.logging.Logger;


public final class ArrayReverser {
private static final Logger LOGGER = Logger.getLogger(ArrayReverser.class.getName());


private ArrayReverser () {


}


public static <T> void reverse(T[] seed) {
reverse(seed, 0, seed.length);
}


public static <T> void reverse(T[] seed, int startIndexInclusive, int endIndexExclusive) {
if (seed == null || seed.length == 0) {
LOGGER.warning("Nothing to rotate");
}
int start = startIndexInclusive < 0 ? 0 : startIndexInclusive;
int end = Math.min(seed.length, endIndexExclusive) - 1;
while (start < end) {
swap(seed, start, end);
start++;
end--;
}
}


private static <T> void swap(T[] seed, int start, int end) {
T temp =  seed[start];
seed[start] = seed[end];
seed[end] = temp;
}


}

这里是对应的单元测试

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;


import org.junit.Before;
import org.junit.Test;


public class ArrayReverserTest {
private Integer[] seed;


@Before
public void doBeforeEachTestCase() {
this.seed = new Integer[]{1,2,3,4,5,6,7,8};
}


@Test
public void wholeArrayReverse() {
ArrayReverser.<Integer>reverse(seed);
assertThat(seed[0], is(8));
}


@Test
public void partialArrayReverse() {
ArrayReverser.<Integer>reverse(seed, 1, 5);
assertThat(seed[1], is(5));
}
}
Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse()可以反转__abc1,而java.util.Arrays.asList()返回一个列表,该列表包装了你传递给它的特定数组,因此yourArray在调用Collections.reverse()之后被反转。

其代价只是创建一个list对象,不需要额外的库。

在Tarik和他们的评论者的回答中已经提出了一个类似的解决方案,但我认为这个答案会更简洁,更容易被分析。

另一种反向数组的方法

public static int []reversing(int[] array){
int arraysize = array.length;
int[] reverse = new int [arraysize+1];
for(int i=1; i <= arraysize ; i++){
int dec= arraysize -i;
reverse[i] = array[dec];
}
return reverse;
}

番石榴:

Collections.reverse(Ints.asList(array));

由于我想保持我原来的Array原样,我用以下方法解决了这个问题:

List<Integer> normalArray= new ArrayList<>();
List<Integer> reversedArray = new ArrayList<>();


// Fill up array here


for (int i = 1; i <= normalArray.size(); i++) {
reversedArray .add(normalArray.get(normalArray.size()-i));
}
所以基本上循环遍历初始数组,并将所有的值以相反的顺序添加到新的(反向的)数组中。列表的类型可以是任何类型。 我多次执行这段代码,这导致其他一些解决方案不起作用
int[] arrTwo = {5, 8, 18, 6, 20, 50, 6};


for (int i = arrTwo.length-1; i > 0; i--)
{
System.out.print(arrTwo[i] + " ");
}

这里已经有很多答案,主要集中在就地修改数组。但是为了完整起见,这里有另一种使用Java流来保留原始数组并创建一个新的反向数组的方法:

    int[] a = {8, 6, 7, 5, 3, 0, 9};
int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();

以下是我想到的:

// solution 1 - boiler plated
Integer[] original = {100, 200, 300, 400};
Integer[] reverse = new Integer[original.length];


int lastIdx = original.length -1;
int startIdx = 0;


for (int endIdx = lastIdx; endIdx >= 0; endIdx--, startIdx++)
reverse[startIdx] = original[endIdx];


System.out.printf("reverse form: %s", Arrays.toString(reverse));


// solution 2 - abstracted
// convert to list then use Collections static reverse()
List<Integer> l = Arrays.asList(original);
Collections.reverse(l);
System.out.printf("reverse form: %s", l);

对于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]

具有o(n)个时间复杂度和o(1)个空间复杂度的解。

void reverse(int[] array) {
int start = 0;
int end = array.length - 1;
while (start < end) {
int temp = array[start];
array[start] = array[end];
array[end] = temp;
start++;
end--;
}
}
   import java.util.Scanner;
class ReverseArray
{
public static void main(String[] args)
{
int[] arra = new int[10];
Scanner sc = new Scanner(System.in);
System.out.println("Enter Array Elements : ");
for(int i = 0 ; i <arra.length;i++)
{
arra[i] = sc.nextInt();
}


System.out.println("Printing  Array : ");
for(int i = 0; i <arra.length;i++)
{
System.out.print(arra[i] + " ");
}


System.out.println();
System.out.println("Printing  Reverse Array : ");
for(int i = arra.length-1; i >=0;i--)
{
System.out.print(arra[i] + " ");
}
}
}

有两种方法可以解决这个问题:

1. 在空格中反转数组。

步骤1。交换开始和结束索引处的元素。

步骤2。递增开始索引,递减结束索引。

步骤3。迭代步骤1和步骤2,直到启动index <结束索引

此时,时间复杂度为O(n)空间复杂度为O(1)

在空间中反转数组的示例代码如下:

public static int[] reverseAnArrayInSpace(int[] array) {
int startIndex = 0;
int endIndex = array.length - 1;
while(startIndex < endIndex) {
int temp = array[endIndex];
array[endIndex] = array[startIndex];
array[startIndex] = temp;
startIndex++;
endIndex--;
}
return array;
}

2. 使用辅助数组反转数组。

步骤1。创建一个大小等于给定数组的新数组。

< p >步骤2。元素从开始索引开始插入到新数组中

.

.

因此,时间复杂度为O(n)空间复杂度为O(n)

用辅助数组反转数组的示例代码如下:

public static int[] reverseAnArrayWithAuxiliaryArray(int[] array) {
int[] reversedArray = new int[array.length];
for(int index = 0; index < array.length; index++) {
reversedArray[index] = array[array.length - index -1];
}
return reversedArray;
}

此外,我们可以使用Java中的Collections API来实现这一点。

Collections API在内部使用相同的反向空间方法。

使用Collections API的示例代码如下:

public static Integer[] reverseAnArrayWithCollections(Integer[] array) {
List<Integer> arrayList = Arrays.asList(array);
Collections.reverse(arrayList);
return arrayList.toArray(array);
}
static int[] reverseArray(int[] a) {
int ret[] = new int[a.length];
for(int i=0, j=a.length-1; i<a.length && j>=0; i++, j--)
ret[i] = a[j];
return ret;
}

2种反转数组的方法。

  1. 使用For循环,交换元素直到中间点,时间复杂度为O(n/2)。

    private static void reverseArray() {
    int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
    
    
    for (int i = 0; i < array.length / 2; i++) {
    int temp = array[i];
    int index = array.length - i - 1;
    array[i] = array[index];
    array[index] = temp;
    }
    System.out.println(Arrays.toString(array));
    

    } < / p >

  2. 使用内置函数(Collections.reverse())

    private static void reverseArrayUsingBuiltInFun() {
    int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
    
    
    Collections.reverse(Ints.asList(array));
    System.out.println(Arrays.toString(array));
    

    输出:[6,5,4,3,2,1]

 public static int[] reverse(int[] array) {


int j = array.length-1;
// swap the values at the left and right indices //////
for(int i=0; i<=j; i++)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
j--;
}


return array;
}


public static void main(String []args){
int[] data = {1,2,3,4,5,6,7,8,9};
reverse(data);


}
    public static void main(String args[])    {
int [] arr = {10, 20, 30, 40, 50};
reverse(arr, arr.length);
}


private static void reverse(int[] arr,    int length)    {


for(int i=length;i>0;i--)    {
System.out.println(arr[i-1]);
}
}

上面有一些很棒的答案,但我是这样做的:

public static int[] test(int[] arr) {


int[] output = arr.clone();
for (int i = arr.length - 1; i > -1; i--) {
output[i] = arr[arr.length - i - 1];
}
return output;
}

enter image description here

小菜一碟。 我是为string做的,但是,它没有太大的不同

一种无需额外库、导入或静态引用即可进行反向操作的简便方法。

int[] a = {1,2,3,4,5,6,7,23,9}, b; //compound declaration
var j = a.length;
b = new int[j];
for (var i : a)
b[--j] = i; //--j so you don't have to subtract 1 from j. Otherwise you would get ArrayIndexOutOfBoundsException;
System.out.println(Arrays.toString(b));

当然,如果你确实需要a作为反向数组,只需使用

a = b; //after the loop

以下是精简版:

我的解决方案创建了一个反转的新数组 每次迭代i时,for循环都会插入最后一个索引[array]。长度- 1]到当前索引[i] 然后通过减去当前迭代数组[(array. array.)]继续相同的过程。长度- 1)- i]从最后一个索引和插入元素到反向数组的下一个索引!< / p >
private static void reverse(int[] array) {
int[] reversed = new int[array.length];


for (int i = 0; i < array.length; i++) {
reversed[i] = array[(array.length - 1) - i];
}
System.out.println(Arrays.toString(reversed));
}

只是为了它。人们通常只需要反向排列的数组或列表上的“视图”,而不是在处理流和集合时完全不需要反向数组,而是原始数组/集合上的“反向”视图。,最好创建一个在列表/数组上具有反向视图的工具包。

所以创建你的Iterator实现,它接受一个数组或列表并提供输入。

/// Reverse Iterator
public class ReverseIterator<T> implements Iterator<T> {
private int index;
private final List<T> list;
public ReverseIterator(List<T> list) {
this.list = list;
this.index = list.size() - 1;
}
public boolean hasNext() {
return index >= 0 ? true : false;
}
public T next() {
if(index >= 0)
return list.get(index--);
else
throw new NoSuchElementException();
}
}

数组情况的实现非常类似。当然,迭代器也可以是流或集合的源。

因此,当你想做的只是迭代数组/列表或将其提供给流或新的集合/数组时,创建一个新数组并不总是最好的。

它有两个解

  1. < p >循环

  2. < p >递归

    公共类_1_ReverseArray {

     public static void main(String[] args) {
    int array[] = {2, 3, 1, 4, 9};
    //reverseArray(array, 0, array.length - 1);
    reverseArrayWhileLoop(array, 0, array.length - 1);
    printArray(array);
    }
    
    
    private static void printArray(int[] array) {
    for (int a : array) {
    System.out.println(a);
    }
    }
    
    
    private static void reverseArray(int[] array, int start, int end) {
    if (start > end) {
    return;
    } else {
    int temp;
    temp = array[start];
    array[start] = array[end];
    array[end] = temp;
    reverseArray(array, start + 1, end - 1);
    }
    }
    
    
    private static void reverseArrayWhileLoop(int[] array, int start, int end) {
    while (start < end) {
    int temp;
    temp = array[start];
    array[start] = array[end];
    array[end] = temp;
    start++;
    end--;
    }
    }
    

对非基本类型数组使用泛型的实现。

    //Reverse and get new Array -preferred
public static final <T> T[] reverse(final T[] array) {
final int len = array.length;
final T[] reverse = (T[]) Array.newInstance(array.getClass().getComponentType(), len);
for (int i = 0; i < len; i++) {
reverse[i] = array[len-(i+1)];
}
return reverse;
}
    

//Reverse existing array - don't have to return it
public static final <T> T[] reverseExisting(final T[] array) {
final int len = array.length;
for (int i = 0; i < len/2; i++) {
final T temp = array[i];
array[i] = array[len-(i+1)];
array[len-(i+1)] = temp;
}
return array;
}

简单的方法:

    for(int i=queue.length-1;i>=0;i--){
System.out.print(queue[i] + "  ");
}