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