본문 바로가기

JavaCode(review)

Collections.binarySearch(); / Theater코딩에 binarySearch 이용

반응형

sorted list(정렬된 리스트)에서 검색 빠르게 처리 하고싶을때, 쓰면 좋다.( 검색결과는 index값으로 전환됨.)

comparator를 사용하며, 찾지 못하면 - 값.

 

ex)

ascending order일때

int index = Collections.binarchSearch(List, seachKey) ;

or

int index = Collections.binarchSearch(List, searchKey, 지정한comparator);   

     -1. desceding order 일때

          int index = Collections.binarchSearch(List, searchKey, Collections.reverseOrder);  

     -2. List of user-defined class objects 일때

          int index = Collections.binarchSearch(List, searchKey, null);

 

참고)

List가 Searching in a list of user-defined class objects ??

(implemnets Comparable<Class>.......@override  compareTo/compareToIgnoreCase) 이용

 

 

https://tadomstudio.tistory.com/47   collections.binarySearcy개념 참고

https://www.geeksforgeeks.org/collections-binarysearch-java-examples/ collections.binarySearcy개념 참고 V

https://jamesdreaming.tistory.com/83 

compareTo/compareToIgnoreCase 개념참고(ingoreCase는 compareTo와 거이 동일, 단 대소문자 무시하라는 말 )

 

예제)

collection개념 예제 (Theater Class - Seat innerClass) 에 Collections.binarySearch 이용.

결과값은 당연히 동일.

 

Theater Class/ Seat Class(InnerClass)

package com.timbuchalka;

import java.util.*;

/**
 * Created by dev on 2/12/2015.
 */
public class Theatre {
    private final String theatreName;
    private List<Seat> seats = new ArrayList<>();

    public Theatre(String theatreName, int numRows, int seatsPerRow) {
        this.theatreName = theatreName;

        int lastRow = 'A' + (numRows -1);
        for (char row = 'A'; row <= lastRow; row++) {
            for(int seatNum = 1; seatNum <= seatsPerRow; seatNum++) {
                Seat seat = new Seat(row + String.format("%02d", seatNum));
                seats.add(seat);
            }
        }
    }

    public String getTheatreName() {
        return theatreName;
    }
                                                    //  binarySearch 이용        V
    public boolean reserveSeat(String seatNumber) {
        Seat requestSeat = new Seat(seatNumber);    //object define
        int foundSeat = Collections.binarySearch(seats, requestSeat,null);
        if(foundSeat >=0){      //index가 0 이상이면 = 좌석이 존재한다면
            return seats.get(foundSeat).reserve();  //좌석존재시, innerClass reserver method실행
        }else{
            System.out.println("There is no seat : "+seatNumber); //좌석 아예 존재x
            return false;
        }
    }

    // for testing
    public void getSeats() {
        for(Seat seat : seats) {
            System.out.println(seat.getSeatNumber());
        }
    }
    //InnerClass
    private class Seat implements Comparable<Seat> {    //comparator 이용  V
        private final String seatNumber;
        private boolean reserved = false;

        public Seat(String seatNumber) {
            this.seatNumber = seatNumber;
        }

        @Override                                   //compareTo     V
        public int compareTo(Seat seat) {
            return this.seatNumber.compareToIgnoreCase(seat.getSeatNumber());
        }

        public boolean reserve() {
            if(!this.reserved) {
                this.reserved = true;
                System.out.println("Seat " + seatNumber + " reserved");
                return true;
            } else {
                return false;
            }
        }

        public boolean cancel() {
            if(this.reserved) {
                this.reserved = false;
                System.out.println("Reservation of seat " + seatNumber + " cancelled");
                return true;
            } else {
                return false;
            }
        }

        public String getSeatNumber() {
            return seatNumber;
        }
    }

}

Main

package com.timbuchalka;

public class Main {

    public static void main(String[] args) {
	    Theatre theatre = new Theatre("Olympian", 8, 12);
//        theatre.getSeats();
        if(theatre.reserveSeat("H11")) {
            System.out.println("Please pay");
        } else {
            System.out.println("Sorry, seat is taken");
        }

        if(theatre.reserveSeat("H11")) {
            System.out.println("Please pay");
        } else {
            System.out.println("Sorry, seat is taken");
        }
    }
}

//Output
D:\IT\JDK\jdk11.0.6_10\bin\java.exe "-javaagent:D:\IT\IDEA\IntelliJ IDEA Community Edition 2020.1\lib\idea_rt.jar=50281:D:\IT\IDEA\IntelliJ IDEA Community Edition 2020.1\bin" -Dfile.encoding=UTF-8 -classpath D:\IT\Java-Collections-Binary-Search-Source-code\out\production\Collections com.timbuchalka.Main
Seat H11 reserved
Please pay
Sorry, seat is taken

Process finished with exit code 0