CodeGym/Java Blog/무작위의/배열 클래스
John Squirrels
레벨 41
San Francisco

배열 클래스

무작위의 그룹에 게시되었습니다
회원
안녕하세요! :) 오늘 수업에서는 Java의 Arrays 클래스에 대해 이야기하겠습니다. 지난 시간에 배열이라는 데이터 구조에 대해 알아봤습니다. 우리는 그것들을 만들고 데이터로 채우는 방법을 배웠습니다. 그리고 그것들이 어떻게 메모리에 저장되는지 살펴봤습니다. 오늘은 실제 작업에서 자주 볼 수 있는 어레이 작업의 몇 가지 작업과 예를 살펴보겠습니다. 예를 들어, 다음과 같은 상황을 상상해 보십시오. 10개의 난수 배열이 있습니다.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
우리의 임무는 이 배열을 오름차순으로 정렬하는 것입니다: 가장 작은 것부터 가장 큰 것까지. 최종적으로는 다음과 같아야 합니다. [-234, -2, 16, 26, 35, 43, 92, 99, 167] 어떻게 해야 할까요? 이 작업은 사소한 일이 아닙니다. 우리는 전에 이것을 해본 적이 없습니다 :/ 아이디어가 있습니까? 맞춰봐. 여기에 한 가지 해결책이 있습니다.
  • 배열의 모든 요소를 ​​살펴봅니다. 각 요소를 다음 요소와 비교합니다([0]과 [1], [1]과 [2], [2]와 [3] 등). 현재 요소가 다음 요소보다 크면 교환하고 다음 요소로 이동합니다. 그렇지 않은 경우 그대로 두고 계속 진행하십시오.
  • 따라서 요소를 처음 통과한 후 가장 큰 값(167)이 마지막 셀에 있음이 보장됩니다.
  • 이제 모든 요소를 ​​다시 검토하지만 이번에는 두 번째 요소(가장 큰 숫자가 이미 제자리에 있음)에 대한 인덱스 [0]부터 시작하여 동일한 비교 및 ​​교환을 수행합니다. 이 패스 후 끝에서 두 번째 셀에서 두 번째로 큰 값(99)을 갖게 됩니다.
  • 배열 요소가 있는 만큼 이 프로세스를 반복합니다.
아이디어가 있습니다. 이제 코드만 작성하면 됩니다. 다음과 같습니다. 배열 클래스와 그 용도 - 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 not in the right 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];
배열에 대해 이미 알고 있는 것을 사용하여 어떻게 할 것인지 생각해 보십시오. 예를 들어 루프에서 숫자 배열을 살펴보고 해당 요소를 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 작성자에 의해 오랫동안 해결되었습니다. 우리는 "바퀴를 재발명"하고 자체 솔루션을 코딩할 필요가 없습니다. 배열로 작업할 때 일반적인 작업을 수행하는 데 도움이 되는 특수 정적 클래스( 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 클래스 의 다른 메서드인 Arrays.toString()을 사용했습니다. . Java의 배열은 자체적으로 toString() 메서드를 재정의하지 않습니다 . 그래서 간단하게 작성하면
System.out.println(numbers.toString());
Object 클래스의 toString()이 호출됩니다. 배열의 경우 출력은 다음과 같습니다. [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() 메서드에 원래 배열(값을 복사하려는 배열)과 데이터를 복사할 새 배열의 길이를 전달합니다 . 이 경우 전체 배열을 복사하려고 하므로 number.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개 요소만 새 배열에 복사됩니다. 콘솔 출력: [167, -2, 16, 99] 그런데 배열을 사용 하면 배열의 시작 부분이 아닌 중간에서 배열의 일부를 복사할 수도 있습니다.
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] 숫자가 두 번째(포함) 요소에서 여섯 번째(포함되지 않음) 요소까지 두 번째 배열에서 새 배열로 복사되었습니다. 두 배열을 비교해야 할 수도 있습니다. 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));
   }
}
그러면 거짓이 됩니다. 참조를 비교하는 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?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
출력: 이 2차원 배열은 같은가요? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 보시다시피 Arrays.copyOf () 메서드는 2차원 배열을 복사할 수 있었습니다. 그리고 이 클래스에는 2차원 배열을 비교하고 표시하는 특수 메서드인 deepEqualsdeepToString() 이 있습니다 . 앞으로 Java의 제작자가 프로그래머가 자주 직면하는 많은 상황을 예상하고 Java 언어로 기성 솔루션을 구현하는 것을 반복적으로 보게 될 것입니다. 이러한 솔루션을 사용하는 것이 바퀴를 재발명하는 것보다 훨씬 쉽고 편리합니다. :) Oracle 웹 사이트 에서 Arrays 클래스에 대한 설명서를 읽어 보십시오 . 공부에 행운을 빕니다!
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다