JavaRush /Java Blog /Random-KO /배열 클래스 및 사용법

배열 클래스 및 사용법

Random-KO 그룹에 게시되었습니다
다시 한번 안녕하세요! :) 지난 강의에서 우리는 배열 (Java 배열)과 같은 데이터 구조에 대해 알게 되었고, 배열을 생성하고 데이터로 채우는 방법과 메모리에 저장하는 방법도 배웠습니다. 오늘은 실제 작업에서 자주 접하게 되는 배열 작업의 몇 가지 작업과 예를 살펴보겠습니다. 예를 들어, 다음 상황을 상상해 보세요. 무작위 순서로 쓰여진 10개의 숫자 배열이 있습니다.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
우리의 임무는 이 배열을 가장 작은 숫자부터 가장 큰 숫자까지 오름차순으로 정렬하는 것입니다. 결국 다음과 같아야 합니다.
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
어떻게 해야 할까요? 이 작업은 결코 간단하지 않습니다. 우리는 이전에 이것을 해본 적이 없습니다 :/ 어떤 아이디어가 있습니까? 맞춰봐. 예를 들어 우리가 할 수 있는 일은 다음과 같습니다.
  • 배열의 모든 요소를 ​​반복합니다. 각 요소를 다음 요소( [0]with [1], [1]with [2], [2]with [3]등)와 비교합니다. 현재 배열 요소가 다음 요소보다 크면 이를 교환하고 다음 요소로 이동합니다. 그렇지 않다면 그대로 두고 계속 진행하세요.

  • 따라서 배열의 요소를 처음 통과한 후 가장 큰 값(167)이 마지막 셀에 있음이 보장됩니다.

  • 이제 index 가 있는 요소부터 시작하여 [0]끝에서 두 번째 요소(가장 큰 숫자가 이미 해당 위치에 있음)까지 배열의 모든 요소를 ​​다시 살펴보고 동일한 비교 및 ​​교환을 수행해 보겠습니다. 
    마지막으로 두 번째 셀에서는 두 번째로 높은 값(99)을 갖게 됩니다.

  • 배열에 마이너스 1개의 요소가 있는 만큼 이 작업을 반복해 보겠습니다.
배열 클래스 및 사용법 - 2우리는 아이디어를 내놓았고 남은 것은 코드를 작성하는 것뿐입니다. 다음과 같이 보일 것입니다:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
음... 좀 복잡해 보이네요 -_- 일반적인 동작 원리는 분명해 보여도 이렇게 간단해 보이는 작업을 해결하려면 꽤 많은 코드를 작성해야 합니다. 좋아요, 어쩌면 우리가 우리 자신을 과대평가한 게 아닐까요? 아마도 지금까지 우리가 맡은 임무는 우리에게 너무 어려울 것입니다. 더 간단한 것을 시도해 봅시다. 예를 들어, 동일한 숫자 배열을 살펴보겠습니다.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
우리의 임무는 그 내용을 다른 배열에 복사하는 것입니다.
int [] numbersCopy = new int[10];
이미 가지고 있는 어레이에 대한 지식을 사용하여 이를 어떻게 수행할 것인지 생각해 보십시오. 예를 들어, 배열을 반복 numbers하고 해당 요소를 하나씩 다음 항목에 쓸 수 있습니다 numbersCopy.
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
글쎄, 우리는 어느 정도 해냈습니다! 문제는 해결된 것 같지만, 다시 한 번 말하지만, 자주 실행해야 한다면 코드에 동일한 루프가 여러 개 있을 것입니다. 실제로 이러한 문제와 기타 문제는 Java 창시자에 의해 오랫동안 해결되어 왔으며 자체 솔루션을 위해 "바퀴를 다시 만들거나" 일부 코드를 작성할 필요가 없습니다.

Java 배열 클래스

특수 Java 클래스는 배열 작업 시 일반적인 문제를 해결하는 데 도움이 됩니다 Arrays. Java 프로그래머가 작업 중에 직면하는 가장 일반적인 문제를 해결하기 위해 이 클래스에 메서드가 추가되었습니다. 예를 들어, 우리가 해결책을 찾으려고 노력한 배열 정렬 작업은 한 줄로 해결할 수 있습니다.
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
이 메서드는 Arrays.sort()배열을 정렬합니다. 게다가 여기에 내장된 알고리즘은 우리가 작성한 코드보다 훨씬 더 효율적입니다. 콘솔 출력:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
참고: 배열을 문자열로 변환하기 위해 다른 클래스 메서드인 를 사용 했습니다 Arrays. Java 배열Arrays.toString() 자체 는 . 그러니까 그냥 쓰면 toString()
System.out.println(numbers.toString());
toString()클래스 메소드가 호출됩니다 Object. 배열의 경우 출력은 다음과 같습니다.

[I@4554617c
이제 결론이 왜 이런 것인지 자세히 설명하지 않겠습니다. 가장 중요한 것은 이것이 분명히 우리에게 필요한 것이 아니라는 것입니다. 그러나 Arrays.toString()은 우리가 원하는 것을 수행했습니다. 그건 그렇고, 복사 문제도 수업에서 쉽게 해결됩니다 Arrays.
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
메서드에 Arrays.copyOf()원래 배열(값을 복사해야 함)과 데이터를 복사할 새 배열의 길이를 전달합니다. 이 경우 길이를 로 표시했습니다 numbers.length. 전체 배열을 복사하고 싶습니다. 처음 몇 개의 요소만 복사하려면 새 배열의 길이를 더 짧게 지정할 수 있습니다.
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
여기서는 새 배열의 길이를 4로 지정했습니다. 따라서 처음 4개 요소만 numbers새 배열에 복사됩니다. 콘솔 출력:

[167, -2, 16, 99]
그건 그렇고, 배열의 일부를 복사해야 하지만 처음부터가 아니라 "중간부터" 복사해야 하는 경우 Arrays에도 이 작업을 수행할 수 있습니다.
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
결론:

[16, 99, 26, 92]
셀 2( 포함 )부터 6( 비포함 )까지 의 숫자가 새 배열에 복사되었습니다. 또한 두 배열을 서로 비교해야 할 수도 있습니다. 메소드와 마찬가지로 toString()배열 자체도 메소드를 대체하지 않습니다 equals(). 따라서 이를 다음과 같이 비교하려고 하면 다음과 같습니다.
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
우리는 결과를 얻습니다 false. Object.equals()결국 링크를 비교하는 메서드가 호출됩니다 . 물론 그들은 다릅니다! 하지만 우리는 링크가 아닌 배열의 내용을 비교해야 합니다. 이 클래스 에는 우리에게 필요한 작업을 정확하게 수행하는 Arrays재정의된 메서드가 포함되어 있습니다 .equals()
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
결론:

true
그런데 이 클래스는 Arrays일반 배열뿐만 아니라 2차원 배열에서도 성공적으로 작동합니다.
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
결론:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
보시다시피, 이 방법은 Arrays.copyOf()2차원 배열 복사에 대처했습니다. 이 경우 2차원 배열을 복사할 때 소위 "얕은 복사"가 발생하므로 주의하시기 바랍니다. 그리고 2차원 배열을 비교하고 콘솔에 출력하기 위해 특별한 방법이 제공 deepEquals됩니다 deepToString(). 앞으로는 Java 제작자가 프로그래머가 작업할 때 직면하는 많은 일반적인 상황을 예견하고 이를 위해 기성 솔루션을 언어로 구현한 것을 한 번 이상 보게 될 것입니다. 이러한 솔루션을 사용하는 것은 바퀴를 재발명하는 것보다 훨씬 쉽고 편리합니다. 그렇죠? :) OracleArrays 웹사이트 의 수업 문서를 꼭 읽어보세요 . 공부에 행운이 있기를 바랍니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION