이전 포스트에서는 Stack을 이용한 예제를 살펴보았지만 이번에는 Queue를 활용해 보겠습니다.
package JavaChap11;
import java.util.*;
class Ex11_4 {
static Queue q = new LinkedList();
static final int MAX_SIZE = 5;
public static void main(String() args) {
System.out.println("help를 입력하면 도움말을 볼 수 있습니다.
");
while(true) {
System.out.print(">>");
try {
// 화면으로부터 라인단위로 입력받는다.
Scanner s = new Scanner(System.in);
String input = s.nextLine().trim(); //공백 제거 -> 앞뒤 공백
if("".equals(input)) continue;
if(input.equalsIgnoreCase("q")) {
System.exit(0); // 프로그램 종료
} else if(input.equalsIgnoreCase("help")) {
System.out.println(" help - 도움말을 보여줍니다.
");
System.out.println(" q 또는 Q - 프로그램을 종료합니다.
");
System.out.println(" history - 최근에 입력한 명령어를 "
+ MAX_SIZE +"개 보여줍니다.
");
} else if(input.equalsIgnoreCase("history")) { //대소문자 구별 안함
int i=0;
// 입력받은 명령어를 저장하고,
save(input);
// LinkedList의 내용을 보여준다.
LinkedList tmp = (LinkedList)q;
ListIterator it = tmp.listIterator();
while(it.hasNext())
System.out.println(++i+"."+it.next());
} else {
save(input);
System.out.println(input);
} // if(input.equalsIgnoreCase("q")) {
} catch(Exception e) {
System.out.println("입력오류입니다.
");
}
} // while(true)
} // main()
public static void save(String input) {
// queue에 저장한다.
if(!
"".equals(input)) //if(!
input.equals(""))
q.offer(input); //큐에 저장 명령
// queue의 최대크기를 넘으면 제일 처음 입력된 것을 삭제한다.
if(q.size() > MAX_SIZE) // size()는 Collection인터페이스에 정의
q.remove(); //q.poll()도 동일하다.
}
} // end of class
=================실행 결과=====================
1.D
두 번째 이야기
>>이야기
1.D
두 번째 이야기
3.역사
>>이야기
1.D
두 번째 이야기
3.역사
4.역사
>>이야기
1.D
두 번째 이야기
3.역사
4.역사
5.역사
>>이야기
첫 번째 이야기
두 번째 이야기
3.역사
4.역사
5.역사
>>q
static Queue q = new LinkedList();
static final int MAX_SIZE = 5;
먼저 대기열을 구현하고 최대 5개만 저장하도록 설정을 구성합니다.
while(true) {
System.out.print(">>");
무한 루프를 돌린 후,
Scanner s = new Scanner(System.in);
String input = s.nextLine().trim();
값을 입력하면 입력한 값에서 선행 및 후행 공백이 제거됩니다.
if("".equals(input)) continue;
빈 문자열이면 Continue가 실행되고 다시 While(true)으로 이동하고 >>가 표시됩니다.
if(input.equalsIgnoreCase("q")) {
System.exit(0); // 프로그램 종료
} else if(input.equalsIgnoreCase("help")) {
System.out.println(" help - 도움말을 보여줍니다.
");
System.out.println(" q 또는 Q - 프로그램을 종료합니다.
");
System.out.println(" history - 최근에 입력한 명령어를 "
+ MAX_SIZE +"개 보여줍니다.
");
} else if(input.equalsIgnoreCase("history")) { //대소문자 구별 안함
int i=0;
// 입력받은 명령어를 저장하고,
save(input);
// LinkedList의 내용을 보여준다.
LinkedList tmp = (LinkedList)q;
ListIterator it = tmp.listIterator();
while(it.hasNext())
System.out.println(++i+"."+it.next());
} else {
save(input);
System.out.println(input);
} /
대소문자를 구분하지 않고 q를 입력하면 프로그램을 종료합니다.
도움말, q 또는 Q 및 히스토리와 같은 기능이 구현되었으며 여기서 자세히 살펴볼 곳은 히스토리입니다.
이력 입력 시 i=0으로 설정되며 입력된 이력도 저장됩니다.
그리고 LinkedList를 구현함으로써 지금까지 입력된 리스트 hasNext()는 계속해서 다음 요소를 호출한다.
최대 5개의 리스트가 로드되며 FIFO 구조에 먼저 들어오는 항목이 먼저 추출되어 사라집니다.
if(q.size() > MAX_SIZE) // size()는 Collection인터페이스에 정의
q.remove();
크기는 초기에 5로 설정되어 있으며 5 이상의 입력 단어가 수신되면 내용이 지워집니다.
FIFO 구조로 제거됩니다.