Java에서 int 어레이를 되돌리려면 어떻게 해야 하나요?
자바에서 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;
}
이 방법에서는 각 요소를 두 번 스왑하므로 결과는 초기 목록과 동일합니다.
공유와 함께.Lang, 당신은 간단히 사용할 수 있습니다.
ArrayUtils.reverse(int[] array)
대부분의 경우 문제 해결 시 유닛 테스트와 사용자 테스트를 거친 쉽게 이용할 수 있는 라이브러리를 사용하는 것이 더 빠르고 안전합니다.
Collections.reverse(Arrays.asList(yourArray));
java.util.Collections.reverse()
수 java.util.List
§java.util.Arrays.asList()
, 「」는 「배열」입니다.yourArray
후에 역전되다Collections.reverse()
.
비용은 List-object를 하나만 생성하면 되고 추가 라이브러리는 필요하지 않습니다.
Tarik과 그 코멘트의 답변에서도 비슷한 해결책이 제시되었지만, 이 답변이 더 간결하고 쉽게 해석될 수 있을 것이라고 생각한다.
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--;
}
}
여기에는 이미 많은 답변이 있습니다.대부분은 어레이의 인플레이스 수정에 초점이 맞춰져 있습니다.그러나 완전성을 위해 Java 스트림을 사용하여 원래 어레이를 보존하고 새로운 리버스 어레이를 작성하는 또 다른 방법이 있습니다.
int[] a = {8, 6, 7, 5, 3, 0, 9};
int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();
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]
Guava 포함:
Collections.reverse(Ints.asList(array));
for(int i=validData.length-1; i>=0; i--){
System.out.println(validData[i]);
}
심플한 루프!
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;
}
보다 원시적인 데이터(즉, 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];
}
}
프로그램은 다음 기간 동안만 작동합니다.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
}
위의 몇 가지 훌륭한 답변이 있지만, 저는 이렇게 했습니다.
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;
}
어레이를 거꾸로 반복하는 것이 가장 효율적입니다.
Aaron의이 이 할 수 있는지 Collections.reverse(list);
아는 사람이 있나요?
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;
}
}
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--;
}
}
이 문제의 해결방법은 다음 두 가지가 있습니다.
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;
}
또한 이를 위해 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);
}
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]);
}
}
이런 식으로 하면 실수할 확률이 훨씬 더 높지 않을까요?
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;
어레이를 리버스하는 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));
}
빌트인 함수 사용(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 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 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 솔루션을 사용하여 코드 모양이 다음과 같은 온도 변수를 피합니다.
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/
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;
}
여기에서는, 모든 타입의 어레이를 리버스 하는 심플한 실장 및 풀/부분의 서포트를 소개합니다.
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));
}
}
제가 생각해낸 것은 다음과 같습니다.
// 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);
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;
}
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);
}
언급URL : https://stackoverflow.com/questions/2137755/how-do-i-reverse-an-int-array-in-java
'programing' 카테고리의 다른 글
C의 기능에 전달되는 어레이와 어레이 포인터의 차이 (0) | 2022.07.30 |
---|---|
Vue.js v-for 루프에서 이벤트 처리 동적 생성 버튼 (0) | 2022.07.30 |
V-for에서 여러 기능을 연결할 수 있습니까? (0) | 2022.07.30 |
연산자 우선 순위와 평가 순서 (0) | 2022.07.30 |
호스트 "를 확인할 수 없습니다. 호스트 이름과 연결된 주소가 없습니다. (0) | 2022.07.30 |