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
'JavaCode(review)' 카테고리의 다른 글
Map Interface - collection (0) | 2020.07.05 |
---|---|
Comparable / Comparator - Theater 코딩 이용 (0) | 2020.07.04 |
Collection 개념코딩 - theater coding / string.format이용. (0) | 2020.07.02 |
자바 용어 사이트 oracle java tutorial (0) | 2020.07.02 |
binary search tree (0) | 2020.07.01 |