274

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

それの何が問題なのですか?

4

46 に答える 46

320

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

あなたがやっている方法では、各要素を2回交換するので、結果は最初のリストと同じです。

于 2010-01-26T06:17:44.113 に答える
319

Commons.Langでは、単純に使用できます

ArrayUtils.reverse(int[] array)

ほとんどの場合、単体テストとユーザー テストが完了している簡単に利用できるライブラリを使用する方が、問題を処理するときに迅速でバグが発生しません。

于 2010-01-26T07:27:09.930 に答える
75
Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse()java.util.Lists を逆java.util.Arrays.asList()にして、渡した特定の配列をラップするリストを返すことができるためyourArray、 の呼び出し後に逆になりますCollections.reverse()

コストは 1 つの List オブジェクトを作成するだけで、追加のライブラリは必要ありません。

同様の解決策が Tarik とそのコメンターの回答に示されていますが、この回答はより簡潔で、より簡単に解析できると思います。

于 2016-04-08T08:57:14.657 に答える
58
public class ArrayHandle {
    public static Object[] reverse(Object[] arr) {
        List<Object> list = Arrays.asList(arr);
        Collections.reverse(list);
        return list.toArray();
    }
}
于 2010-01-26T06:11:41.500 に答える
43

明示的な変数を宣言して、ループの各反復で交換するインデックスを追跡すると、アルゴリズムのロジックに従うのが少し簡単になると思います。

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--;
    }
}
于 2010-08-19T14:58:05.830 に答える
13

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]
于 2017-10-15T14:52:22.173 に答える
12

グアバで:

Collections.reverse(Ints.asList(array));
于 2016-12-09T04:57:48.607 に答える
9
for(int i=validData.length-1; i>=0; i--){
  System.out.println(validData[i]);
 }
于 2015-08-16T06:29:21.957 に答える
9

シンプルなforループ!

for (int start = 0, end = array.length - 1; start <= end; start++, end--) {
    int aux = array[start];
    array[start]=array[end];
    array[end]=aux;
}
于 2015-01-31T15:26:42.847 に答える
6

これは私が個人的にそれを解決する方法です。パラメータ化されたメソッドを作成する理由は、整数だけでなく、任意の配列をソートできるようにするためです。

そこから何かを得ていただければ幸いです。

@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;
}
于 2014-04-03T05:31:03.493 に答える
4

あなたのプログラムは でのみ機能し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
}
于 2010-01-26T06:43:43.553 に答える
3

単純に配列を逆方向に繰り返すのが最も効率的です。

アーロンのソリューションがこの呼び出しでこれを行うCollections.reverse(list);かどうかはわかりません。誰か知っていますか?

于 2010-01-26T06:21:29.003 に答える
3
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;
        }
    }
于 2015-12-09T06:22:53.973 に答える
2
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]);
  }
}
于 2012-01-23T17:06:47.310 に答える
2

このようにすると、間違いが発生する可能性がはるかに低くなりますか?

    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;
于 2014-08-04T05:58:15.557 に答える
1
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;
} 
于 2014-12-09T19:46:03.120 に答える
1

これは、任意の型の配列を逆にする単純な実装と、完全/部分的なサポートです。

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));
 }
}
于 2016-01-29T17:46:55.383 に答える
-1
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;
        }
    }
}
于 2015-01-31T14:47:57.587 に答える
-1

これが簡単で迅速な解決策です。それが役に立てば幸い!。

public int[] reverse(int[] arr) {
    for(int i = arr.length; i > 0 ; i--){
        System.out.print(arr[i-1] + " ");
    }
    return arr;
}
于 2016-01-13T00:05:27.537 に答える
-1
   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] + " ");
        }
    }
}
于 2018-01-17T00:03:48.530 に答える
-1

このコードを試してください:

    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));
于 2015-11-30T09:15:07.107 に答える
-1

配列を逆にする別の方法

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;
}
于 2016-08-13T15:58:51.737 に答える
-2

これを使用できます

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>());
于 2015-09-24T16:34:05.337 に答える
-2
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]);  

}
于 2012-01-24T17:32:49.650 に答える