3.6 이중 연결 이스트 응용 - 텍스트 뷰어

  1. 3.6 이중 연결 이스트 응용 - 텍스트 뷰어
    1. 텍스트 뷰어 유틸리티
    2. 문서에 대하여

텍스트 뷰어 유틸리티

제약 조건
1. 더블링크드리스트 을 이용해서 구현한다.
2. 입려되는 텍스트 파일은 오직 txt 파일이다.
3. 입력되는 텍스트 파일은 자바의 IO 관련 클래스를 이용한다.

h3.자바에서의 IO
자바에서의 IO 는 바로 스트림을 빼놓고는 이야기 할수 없다
스트림(Stream)은 연속적인 데이터의 흐름을 의미 한다.
스트림이 들어오고(input) 나가는(output) 것과 관련된 것을 IO 라고 한다.

스트림의 시작 : source
목표지점 : sink or target

라고 하며 데이터는 source 에서 sink 까지 한방향 으로 전달되며 흩어지지 않고 일정한 순서도 있다.
입력을 위한 장치 (System.in , Socket) 나 기본이 되는 단위 (Byte , Char, String, File, Piped) 를 노드(Node) 라고 하고
노드 이외의 것을 필터 (Filter, Processing) 이라고 한다.

1. 노드인 Sustem.in 을 InputStreamReader 가 감싸면 byte 배열은 필요없다.
2. BufferedReader 필터로 InputStreamReader 를 감싸면 한줄단위로 읽어 들일수있다.


  


//기존의 이중연결 DECK 재활용
//텍스트 뷰어 구현에 편하게 약간 가공 했다.

public class DoubleLinkedListDeck {
	private DQueueNode front;
	private DQueueNode rear;
	private int length;
	private DQueueNode nowPostion;
	
	public DoubleLinkedListDeck() {
		this.front = null;
		this.rear = null;
		this.nowPostion = null;
		this.length = 0;		
	}

	public boolean isEmpty() {
		return this.front == null;
	}
	
	public int getLength() {
		return length;
	}
	
	public void setNowPostion(DQueueNode nowPostion) {
		this.nowPostion = nowPostion;
	}

	public void insertFront(String data) {
		DQueueNode newNode = new DQueueNode(data);
		if (isEmpty()) {
			this.front = newNode;
			this.rear = newNode;
			newNode.nextNode = null;
			newNode.prevNode = null;
		}else{
			this.front.prevNode = newNode;
			newNode.nextNode = this.front;
			newNode.prevNode = null;
			this.front = newNode;
		}
		setNowPostion(this.rear);
		System.out.println("DECK 에 insertFront()로 \" " + data + " \" 가 입력되었습니다.");
	}
	
	public String deleteFront(){
		String rtnVal="";
		
		if (isEmpty()) 
			rtnVal = "DoubleLinkedListDeck 이 비었습니다";
		else{
			rtnVal = this.front.data + " 가 DoubleLinkedListDeck 에서 deleteFront() 로 삭제되었습니다.";
			if(this.front.nextNode == null){
				this.front = null;
				this.rear = null;
			}else{
				this.front.nextNode.prevNode = null;
				this.front = front.nextNode;				
				// this.front = front.nextNode;
				// this.front.prev = null;
			}
		}
		setNowPostion(this.rear);
		return rtnVal;
	}
	
	public void insertRear(String data) {
		DQueueNode newNode = new DQueueNode(data);
		if (isEmpty()) {
			this.front = newNode;
			this.rear = newNode;
			newNode.nextNode = null;
			newNode.prevNode = null;
		}else{
			this.rear.nextNode = newNode;
			newNode.nextNode = null;
			newNode.prevNode = this.rear;
			this.rear = newNode;
		}
		setNowPostion(this.rear);
	}
	
	public String deleteRear(){
		String rtnVal = "";
		if (isEmpty()) 
			rtnVal = "DoubleLinkedListDeck 이 비었습니다";
		else{
			rtnVal = this.rear.data + " 가 DoubleLinkedListDeck 에서 deleteRear() 로 삭제되었습니다.";
			if (this.rear.prevNode == null) {
				this.front = null;
				this.rear = null;				
			}else{
				this.rear.prevNode.nextNode = null;
				this.rear = rear.prevNode;				
			}
		}
		setNowPostion(this.rear);
		return rtnVal;
	}
	
	public String viewNextDQueueNode(){
		String rtnVal = viewDQueueNode(this.nowPostion);
		setNowPostion(nowPostion.prevNode);
		return rtnVal;
	}
	
	public String viewPrevDQueueNode(){
		String rtnVal = viewDQueueNode(this.nowPostion);
		setNowPostion(nowPostion.nextNode);
		return rtnVal;
	}
	
	public String viewDQueueNode(DQueueNode node) {
		return node.data;
	}
}


import java.io.BufferedReader;
import java.io.FileReader;

public class DoubleLinkedListDeckTextViewer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DoubleLinkedListDeck dlld = new DoubleLinkedListDeck();
		
		try {
			BufferedReader in = new BufferedReader(new FileReader("c:/test.txt"));	
			String stringLine;
			
			while ((stringLine = in.readLine()) != null) {
				dlld.insertFront(stringLine);
			}
		
			// 아래 부분의 두 메소드(viewNextDQueueNode,viewPrevDQueueNode) 를 이용해서 
			// 키보드 이벤트에 따라 프로세스가 전개 되게 변경하시면 
			// 좀더 직관적인 형태의 뷰어를 얻을수 있습니다. 변경은 본인이 하세요 :D
			
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewPrevDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewNextDQueueNode());
			System.out.println(dlld.viewPrevDQueueNode());
			System.out.println(dlld.viewPrevDQueueNode());
			System.out.println(dlld.viewPrevDQueueNode());
			System.out.println(dlld.viewPrevDQueueNode());
		
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}

문서에 대하여