JavaRush /Java Blog /Random-KO /Java의 컬렉션 | 자바 컬렉션

Java의 컬렉션 | 자바 컬렉션

Random-KO 그룹에 게시되었습니다
안녕하세요! 지난 몇 번의 강의를 통해 우리는 ArrayList를 마스터하는 데 큰 진전을 이루었습니다. 그러나 이 기간 동안 우리는 삭제, 삽입, 콘솔에 출력 등 가장 간단한 작업만 수행했습니다. 물론 이것이 개발자가 ArrayList를 사용할 때 직면하게 되는 문제 목록의 끝은 아닙니다 . 배열과 Arrays 클래스 에 대한 강의를 기억하시나요 ? 이는 프로그래머가 배열 작업 시 직면하는 일반적인 문제를 해결하기 위해 특별히 Java 작성자가 개발했습니다. ArrayList 는 어떻습니까 ? 확실히 그에게도 일반적인 작업 목록이 있습니다. 그것들은 모두 별도의 클래스에서 구현되었습니까? 아니면 매번 원하는 동작을 수동으로 작성해야 합니까? 물론 모든 내용을 직접 작성할 필요는 없습니다. Java에서 컬렉션을 사용할 때 수행되는 가장 일반적인 작업은 이미 특수 정적 클래스 컬렉션에 구현되어 있습니다. 클래스 컬렉션 - 1

Java의 컬렉션

"컬렉션"은 Java의 여러 데이터 구조에 대한 일반적인 이름입니다. 데이터는 다양한 방법으로 저장될 수 있습니다. 지금까지 우리는 데이터가 배열에 저장되는 ArrayList 클래스 만 연구했습니다. 나중에 나머지 컬렉션에 대해 알게 될 것입니다. 이제 Collections 클래스가 ArrayList뿐만 아니라 Java의 다른 유형의 컬렉션(따라서 실제로 이름)과도 작동하도록 설계되었다는 점을 이해하면 충분합니다. 그렇다면 ArrayList로 작업할 때 Collections 클래스를 사용하면 어떤 작업을 해결할 수 있을까요? 첫 번째이자 가장 확실한 것은 정렬입니다. 배열 강의에서 숫자를 사용한 예를 살펴봤으니 이제 문자열을 사용한 예를 살펴보겠습니다. 컬렉션의 내용을 정렬하기 위해 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));

}
결론:

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> lottery = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

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

       Collections.shuffle(lottery);//mix
       System.out.println("Attention! The first 10 numbers appear from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(lottery.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
   }
}

Exception in thread "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));// wrong planet 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, 그는 우리를 위해 일상적이고 비천한 일을 많이 하여 우리가 다른 일에 집중할 수 있게 해줍니다. Oracle 문서 에서 이에 대해 읽어 보십시오 . 거기에는 다른 방법이 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION