Как изменить массив int в Java?
Я пытаюсь отменить массив int в Java.
этот метод не отменяет массив.
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;
}
что с ним не так?
30 ответов:
чтобы отменить массив 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; }
Как вы это делаете, вы меняете каждый элемент дважды, так что результат такой же, как и в исходном списке.
С Commons.Лэнг, вы могли бы просто использовать
ArrayUtils.reverse(int[] array)
в большинстве случаев, это быстрее и безопаснее для ошибок придерживаться легко доступных библиотек уже модульных и пользовательских тестов, когда они заботятся о вашей проблеме.
public class ArrayHandle { public static Object[] reverse(Object[] arr) { List<Object> list = Arrays.asList(arr); Collections.reverse(list); return list.toArray(); } }
Я думаю,что немного легче следовать логике алгоритма, если вы объявляете явные переменные, чтобы отслеживать индексы, которые вы меняете на каждой итерации цикла.
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; } }
Я также думаю, что это более читаемым, чтобы сделать это в то время как цикл.
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--; } }
Collections.reverse(Arrays.asList(yourArray));
java.util.Collections.reverse()
может переломитьjava.util.List
s иjava.util.Arrays.asList()
возвращает список, который обертывает конкретный массив, который вы передаете ему, поэтомуyourArray
отменяется после вызоваCollections.reverse()
.стоимость-это просто создание одного списка-объекта и никаких дополнительных библиотек не требуется.
аналогичное решение было представлено в ответе Тарика и их комментаторов, но я думаю, что этот ответ будет более кратким и более легко разбираемым.
здесь уже есть много ответов, в основном сосредоточенных на изменении массива на месте. Но для полноты картины, вот еще один подход, использующий потоки Java для сохранения исходного массива и создания нового перевернутого массива:
int[] a = {8, 6, 7, 5, 3, 0, 9}; int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();
простой для цикла!
for (int start = 0, end = array.length - 1; start <= end; start++, end--) { int aux = array[start]; array[start]=array[end]; array[end]=aux; }
Это поможет вам
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; }
наиболее эффективно просто выполнить итерацию массива в обратном направлении.
Я не уверен, что решение Аарона делает это 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 }
Если вы работаете с более примитивными данными (например, char, byte, int и т. д.), Вы можете выполнять некоторые забавные операции XOR.
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]; } }
в случае с Java 8 мы также можем использовать потоки для обратного целочисленного массива:
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]
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 int[] reverse(int[] arr) { for(int i = arr.length; i > 0 ; i--){ System.out.print(arr[i-1] + " "); } return 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; } }
разве это не было бы гораздо более маловероятным для ошибок?
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]); } } }
для программ на матрице с использованием массивов это будет хороший источник.Пройдите по ссылке.
используя решение XOR, чтобы избежать переменной temp ваш код должен выглядеть как
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/
вот простая реализация, чтобы обратить массив любого типа, плюс полная/частичная поддержка.
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)); } }
решение с 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--; } }
вот что я придумал:
// 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);
есть два способа решить эту проблему:
1. Обратный массив в пространстве.
Шаг 1. Поменять местами элементы в начале и конце индекса.
Шаг 2. Увеличение начального индекса уменьшение конечного индекса.
Шаг 3. Повторите шаг 1 и Шаг 2 до начального индекса
для этого временная сложность будет 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. Создайте новый массив размером, равным заданному массиву.
Шаг 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; }
кроме того, мы можем использовать API коллекций из Java для этого.
API коллекций внутренне использует тот же обратный подход в пространстве.
пример кода для использования 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 способа реверсирования массива .
использование цикла 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));
}
использование встроенной функции (коллекции.обратный())
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[]){ //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]); }
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; } } }