CodeGym /Java Blog /무작위의 /Java의 컬렉션 클래스
John Squirrels
레벨 41
San Francisco

Java의 컬렉션 클래스

무작위의 그룹에 게시되었습니다
안녕! 지난 몇 번의 수업에서 우리는 ArrayList. 그러나 지금까지는 제거, 삽입 및 표시와 같은 가장 간단한 작업만 수행했습니다. 물론 이것은 개발자가 ArrayList. 배열과 클래스에 대한 강의를 기억하십니까 Arrays? Java 작성자는 배열로 작업할 때 프로그래머가 직면하는 가장 일반적인 작업을 처리하도록 이 클래스를 특별히 설계했습니다. 그리고 어떻습니까ArrayList? 확실히, 그것으로 수행해야 하는 일반적인 작업 목록이 있습니다. 그것들은 모두 특정 클래스에서 구현되었습니까, 아니면 매번 자체 구현을 작성해야 합니까? 물론 모든 것을 직접 작성할 필요는 없습니다. 컬렉션과 관련된 가장 일반적인 작업은 특수 정적 Collections클래스에서 이미 구현되었습니다. 컬렉션 클래스 - 1 Java에서 데이터 구조 그룹은 일반적으로 컬렉션 이라고 합니다 . 데이터는 다양한 방식으로 저장될 수 있습니다. 지금까지 우리는 ArrayList데이터가 배열에 저장되는 클래스에 대해서만 공부했습니다. 나중에 다른 컬렉션에 대해 알게 될 것입니다. 지금은 클래스 CollectionsArrayList, 뿐만 아니라 다른 유형의 컬렉션(따라서 해당 이름)과도 함께 사용할 수 있습니다. 그렇다면 과 Collections함께 작업할 때 수업이 실제로 도움이 되는 작업은 무엇입니까 ArrayList? 첫 번째이자 가장 분명한 것은 정렬입니다. 배열에 대한 수업에서 우리는 숫자의 예를 고려했습니다. 이제 문자열을 사용한 예를 살펴보겠습니다. 이 클래스는 컬렉션의 내용을 정렬하기 위한 메서드를 Collections구현합니다 .sort()

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
출력: [지구, 목성, 화성, 수성, 해왕성, 토성, 천왕성, 금성] 문자열은 알파벳순으로 정렬됩니다! 그런데 왜 알파벳순으로? 이 String클래스는 실제로 문자열을 비교하는 방법(알파벳순)을 관리하는 논리를 구현합니다. 직접 만든 클래스의 경우 자체 비교 논리를 구현할 수 있지만 이에 대해서는 다른 단원에서 설명합니다. 이 Collections클래스는 또한 에서 최소 및 최대 요소를 찾는 데 도움이 됩니다 ArrayList. 이는 min()max()메소드를 사용하여 수행됩니다.

public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
Output: 7 1 당연히 이것은 모든 요소를 ​​반복하고 가장 큰/작은 요소를 찾는 코드를 수동으로 작성하는 것보다 훨씬 더 편리합니다 :) 또 다른 매우 유용한 방법은 입니다 reverse(). 요소가 반대 순서로 이동하도록 목록을 "뒤집어야" 한다면 어떻게 해야 할까요? 그런 알고리즘을 직접 작성하는 것은 그리 쉽지 않을 것입니다 :) 다행히 방법은 reverse()이미 방법을 알고 있습니다. 이 방법이 행성을 알파벳순으로 정렬했다는 사실이 마음에 들지 않고 sort()Z에서 A로 순서를 바꾸고 싶다고 가정합니다.

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
출력: [금성, 천왕성, 토성, 해왕성, 수성, 화성, 목성, 지구] 우리는 정렬, 요소의 순서 등에 대해 많은 이야기를 해왔습니다. 하지만 반대의 목표가 있다면 어떨까요? 예를 들어 빙고 게임을 구현하려고 한다고 가정합니다. 드럼에 100개의 숫자를 추가합니다. 한 번에 하나씩 화면에 나타나야 합니다. 티켓의 모든 숫자를 먼저 지우는 플레이어가 승리합니다. 이는 다음 shuffle()방법을 사용하여 쉽게 구현할 수 있습니다.

public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> bingoDrum = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           bingoDrum.add(i);// add the numbers 1 to 100 to the drum
       }

       Collections.shuffle(bingoDrum);// Mix it up
       System.out.println ("Your attention, please! Here are the first 10 numbers from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(bingoDrum.get(i));
       }

   }
}
산출: 여러분의 관심을 부탁드립니다! 다음은 드럼의 처음 10개 숫자입니다! 32 61 4 81 25 8 66 35 42 71 정말 쉬워요! 문제가 해결되었고 게임의 우리 부분이 작성되었습니다 :) 이제 다른 상황을 상상해 봅시다. solarSystem이전에는 행성이 포함된 목록을 만들었습니다 . 그리고 그것은 모든 면에서 우리에게 적합한 것 같지만 한 가지: 항목을 삭제하고 새 항목을 추가할 수 있습니다 ! 이것은 분명히 우리가 기대하는 동작이 아닙니다. 태양계는 우리 프로그램에서 변경할 수 없어야 합니다. 클래스 Collections에는 매우 흥미로운 방법이 있습니다. unmodifiableList(). 인수로 전달된 목록에서 변경할 수 없는 목록을 만듭니다. 이 목록에서 항목을 추가하거나 삭제할 수 없습니다. 태양계의 행성 목록을 다룰 때 이것이 바로 우리가 원하는 것입니다!

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Pluto");// Try to add a new element
   }
}
출력: "main" 스레드의 예외 java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075) at Main.main(Main.java:21) 이것은 오류입니다. 무엇이든 추가하세요 solarSystem! List<>여기서 주목해야 할 유일한 것은 이 메서드가 (가 아닌 ArrayList<>) 반환한다는 사실입니다 . 이 유형은 모든 종류의 목록에 공통적이기 때문입니다. 쉽게 발생할 수 있는 또 다른 일반적인 상황은 프로그래머가 잘못된 순서로 요소를 추가하는 것입니다. 이런 일이 발생하고 Mercury와 Neptune이 섞인 것을 발견하면 다음 swap()방법을 사용하여 이 실수를 수정할 수 있습니다.

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// The planets are in the wrong order
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
swap()우리는 목록과 교체해야 하는 두 요소의 인덱스를 메서드 에 전달합니다 . 이 메서드는 참조가 아닌 인덱스와 함께 작동합니다. 그래서 여기서 우리는 방법을 사용해야 했습니다 ArrayList.indexOf(). 출력: [해왕성, 금성, 지구, 화성, 목성, 토성, 천왕성, 수성] [수성, 금성, 지구, 화성, 목성, 토성, 천왕성, 해왕성] 마지막으로 매우 흥미로운 방법을 알게 될 것입니다 disjoint(). 두 컬렉션이 교차하는지, 즉 적어도 하나의 동일한 요소가 있는지 확인합니다 . 그렇지 않으면 true를 반환합니다. 그렇게 하면 false를 반환합니다.

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
보시다시피 두 목록은 완전히 다른 요소를 가지고 있으므로 프로그램은 true 를 출력합니다 . 흥미롭고 매우 유용한 수업입니다. 마찬가지로 Arrays일상적이고 지루한 작업을 많이 수행하므로 다른 일에 집중할 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION