제약 조건
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
}
}
}