대기열

All lectures for KO purposes
레벨 1, 레슨 642
사용 가능

대부분의 사람들에게 "대기열"이라는 단어는 기분 좋은 연상을 거의 떠올리지 않습니다. 그러나 오늘 우리는 다른 대기열인 Java 대기열에 대해 이야기하고 있습니다. Java에서 큐는 Queue 인터페이스를 상속하고 Collection 인터페이스를 확장하는 모든 것입니다 . 즉, 대기열을 컬렉션처럼 취급할 수 있습니다.

Java의 대기열은 FIFO 및 LIFO 라는 두 가지 작동 원리를 지원합니다 .

FIFO (First In, First Out) 원칙은 일반 대기열을 제어합니다. 대기열에 추가된 첫 번째 요소가 가장 먼저 대기열에서 나갑니다 .

LIFO (Last In, First Out) 원칙은 스택의 동작을 설명합니다. 큐에 마지막으로 추가된 요소가 가장 먼저 스택을 떠납니다 . 예를 들어, 카드 덱으로 작업하는 방법은 다음과 같습니다. 덱 맨 아래에 도달할 때까지 한 번에 맨 위에서 카드를 제거합니다.

Java의 대기열 계층 구조 는 다음과 같습니다.

여기에서 Queue에는 LinkedList , ArrayDeque 및 PriorityQueue 의 3가지 구현 클래스가 있음을 알 수 있습니다 . LinkedList 및 ArrayDeque는 Queue 가 아니라 Deque를 직접 상속합니다 .

Deque 는 Java 6에 추가된 인터페이스입니다. 여기에는 대기열에 유용한 여러 메서드가 포함되어 있으며 대기열이 양방향(또는 양방향) 대기열로 작동할 수 있습니다. 즉,FIFO및LIFO.

Deque 인터페이스의 두 자손 중 하나는 ArrayDeque 입니다 . 양방향 대기열을 지원하여 양쪽 끝에서 요소를 삽입하고 제거할 수 있습니다. 크기가 자동으로 커지는 동적 배열이기도 합니다.

Queue 의 직계 후손인 PriorityQueue 클래스 도 있습니다 . 이 클래스는 Deque를 구현하는 클래스와 다르게 작동합니다 .

PriorityQueue 는 기본적으로 자연 순서에 따라 요소를 구성하는 우선순위 대기열입니다. 여기서 정렬은 Comparable 및 Comparator 인터페이스를 사용합니다. 원칙은 TreeSet 또는 TreeMap — Comparable 인터페이스를 사용하고 고유한 정렬 순서를 갖는와 동일합니다


PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));

priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");

while (!priorityQueue.isEmpty()) {
   System.out.println(priorityQueue.remove());
}

이 예제를 실행하면 콘솔에 다음과 같은 내용이 표시됩니다.

롭
존
앤드류

정규 컬렉션이 아닌 큐로 작업하고 있으므로 목록에서 요소를 제거해야 합니다. 이를 위해 다음 구조를 사용합니다.


while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.remove());
}

Deque 인터페이스는 Queue 메서드를 상속 하고 몇 가지 흥미로운 자체 메서드를 추가합니다 .

무효 addFirst(E obj) 대기열 앞에 obj 요소를 추가합니다.
무효 addLast(E obj) 대기열 끝에 obj 요소를 추가합니다.
전자 getFirst() 대기열에서 첫 번째 요소를 반환합니다.
전자 getLast() 대기열에서 마지막 요소를 반환합니다.
부울 offerFirst(E obj) obj 요소를 대기열 앞에 추가하고 요소가 추가되면 true를 반환합니다. 그렇지 않으면 false 를 반환합니다 .
부울 offerLast(E obj) 대기열 끝에 obj 요소를 추가하고 요소가 추가되면 true를 반환합니다. 그렇지 않으면 false 를 반환합니다 .
전자() 대기열에서 첫 번째 요소를 가져와서 제거합니다.
무효 푸시(E obj) 대기열 앞에 obj 요소를 추가합니다.
전자 엿보기() 대기열에서 첫 번째 요소를 반환하지만 제거하지는 않습니다.
E 엿보기마지막() 대기열에서 마지막 요소를 반환하지만 제거하지는 않습니다.
E pollFirst() 대기열에서 첫 번째 요소를 반환하고 제거합니다. 요소가 없으면 null을 반환합니다 .
설문마지막() 대기열에서 마지막 요소를 반환하고 제거합니다. 요소가 없으면 null을 반환합니다 .
E 제거마지막() 대기열의 첫 번째 요소를 반환하고 제거합니다. 요소가 없으면 예외를 throw합니다.
전자 removeFirst() 대기열의 마지막 요소를 반환하고 제거합니다. 요소가 없으면 예외를 throw합니다.
부울 removeFirstOccurrence(객체 객체) 대기열에서 obj 의 첫 번째 항목을 제거합니다.
부울 removeLastOccurrence(개체 객체) 대기열에서 obj 의 마지막 항목을 제거합니다.

이제 이러한 방법 중 몇 가지를 실제로 살펴보겠습니다.

먼저 큐에 요소를 추가해 보겠습니다.


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); // Adds "Apple" to the end of the queue
        deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
        deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue
  
        System.out.println(deque);
    
[오렌지, 사과, 파인애플]

이제 대기열에서 값을 가져옵니다.


	Deque<String> deque = new ArrayDeque<>();

	deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 

         
        System.out.println("The first element is: "+ deque.getFirst());
                          
        System.out.println("The last element is: " + deque.getLast());
                          
    }
    

이 코드는 대기열의 첫 번째 요소와 마지막 요소를 표시합니다.

첫 번째 요소: 오렌지
마지막 요소: 파인애플


         Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue

System.out.println(deque);
    

이 코드를 실행하면 다음을 얻습니다.

오렌지
애플

[파인애플,레몬]

pop() 과 poll() 의 차이점은 목록이 빈 목록인 경우 pop()은 NoSuchElementException을 발생시키지만 poll()은 null을 반환한다는 것 입니다 .

이제 pollFirst() 및 pollLast() 메서드를 살펴보겠습니다 .


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
    
오렌지
레몬
[사과, 파인애플]

두 메서드 모두 대기열에서 값을 반환하고 제거합니다.

다음은 peekFirst() 및 peekLast() 메서드를 사용하는 예입니다 .


Deque<String> friends = new ArrayDeque<>();

friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");

System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());

System.out.println(friends);
    
첫 번째 요소: John
마지막 요소: Oliver
[John, Rob, Greg, Max, Oliver]

두 메서드 모두 대기열에서 첫 번째/마지막 요소를 반환하고 제거하지 않습니다. 대기열이 비어 있으면 null이 반환됩니다.

잘하셨어요! 오늘 우리는 Java에서 대기열을 사용하는 방법을 배웠습니다. 이제 실제로 사용하는 방법을 알았습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION