Untitled
unknown
plain_text
4 years ago
6.8 kB
12
Indexable
package Dreampad;
public class UserSolution {
// static int MAX_STR_SIZE = 50000;
//
// static char[] str = new char[MAX_STR_SIZE];
LinkedList list;
Stack undo;
Stack redo;
public class Node {
protected char data;
protected int cursorPosition;
protected Node next;
public Node() {
super();
this.data = ' ';
this.cursorPosition = 0;
this.next = null;
}
public Node(char data, int cursorPosition, Node next) {
super();
this.data = data;
this.cursorPosition = cursorPosition;
this.next = next;
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public int getCursorPosition() {
return cursorPosition;
}
public void setCursorPosition(int cursorPosition) {
this.cursorPosition = cursorPosition;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
public class LinkedList {
protected Node head;
protected Node tail;
protected int size;
protected int cursorPosition;
public LinkedList() {
super();
head = null;
tail = null;
size = 0;
cursorPosition = 0;
}
public LinkedList(Node head, Node tail, int size, int cursorPosition) {
super();
this.head = head;
this.tail = tail;
this.size = size;
this.cursorPosition = cursorPosition;
}
public Node getHead() {
return head;
}
public void setHead(Node head) {
this.head = head;
}
public Node getTail() {
return tail;
}
public void setTail(Node tail) {
this.tail = tail;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getCursorPosition() {
return cursorPosition;
}
public void setCursorPosition(int cursorPosition) {
this.cursorPosition = cursorPosition;
}
public void reset() {
head = null;
tail = null;
size = 0;
cursorPosition = 0;
}
public void InsertAtHead(char data, int cursorPosition) {
Node temp = new Node(data, cursorPosition, null);
if (size == 0) {
head = temp;
tail = temp;
} else {
temp.setNext(head);
head = temp;
}
this.cursorPosition++;
size++;
}
public void InsertAtTail(char data, int cursorPosition) {
if (size == 0) {
InsertAtHead(data, cursorPosition);
return;
}
Node temp = new Node(data, cursorPosition, null);
if (size == cursorPosition) {
tail.setNext(temp);
tail = temp;
this.size++;
this.cursorPosition++;
}
}
public void InsertAtPostion(char data, int cursorPosition) {
Node temp = new Node(data, cursorPosition, null);
if (size == 0 || cursorPosition == 0) { // Them dau
InsertAtHead(data, cursorPosition);
return;
}
if (cursorPosition == size) { // Them cuoi
tail.setNext(temp);
tail = temp;
size++;
this.cursorPosition++;
return;
}
// Them giua
Node p = head;
Node ptr = head;
int index = 0;
while (index < cursorPosition) {
ptr = p;
p = p.getNext();
index++;
}
ptr.setNext(temp);
temp.setNext(p);
this.size++;
this.cursorPosition++;
}
public void DeleteAtHead() {
// TODO Auto-generated method stub
head = head.getNext();
this.size--;
this.cursorPosition--;
if (size == 0) {
reset();
}
}
public void DeleteAtPosition(int cursorPosition) {
if (size == 0 || cursorPosition == 0) {
return;
}
if (cursorPosition == 1) { // Xoa dau
DeleteAtHead();
return;
}
Node p = head;
Node ptr = head;
if (cursorPosition == size) { // Neu xoa o cuoi
while (p.getNext() != null) {
ptr = p;
p = p.getNext();
}
ptr.setNext(p.getNext());
this.tail = ptr;
this.size--;
this.cursorPosition--;
return;
}
// Neu xoa o giua
int index = 0;
while (index < cursorPosition - 1) {
ptr = p;
p = p.getNext();
index++;
}
ptr.setNext(p.getNext());
this.size--;
this.cursorPosition--;
}
public String show() {
String s = "";
if (this.size == 0) {
} else {
Node temp = head;
while (temp != null) {
s = s + temp.getData();
temp = temp.getNext();
}
}
return s;
}
}
public class Stack {
protected Node top;
protected int size;
public Stack() {
super();
top = null;
size = 0;
}
public Stack(Node top, int size) {
super();
this.top = top;
this.size = size;
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void Push(char data, int cursorPosition) {
Node temp = new Node(data, cursorPosition, null);
if (isEmpty()) {
top = temp;
} else {
temp.setNext(top);
top = temp;
}
size++;
}
public Node Pop() {
if (isEmpty()) {
return null;
} else {
Node temp = top;
top = temp.getNext();
temp.setNext(null);
size--;
return temp;
}
}
}
public void init(char[] str) {
list = new LinkedList();
undo = new Stack();
redo = new Stack();
for (int i = 0; i < str.length; i++) {
list.InsertAtTail(str[i], list.cursorPosition);
undo.Push(str[i], list.cursorPosition);
}
}
public void write(char ch) {
if (ch == '\b') {
if (list.cursorPosition != 0) {
list.DeleteAtPosition(list.cursorPosition);
undo.Push(ch, list.cursorPosition);
}
} else {
list.InsertAtPostion(ch, list.cursorPosition);
undo.Push(ch, list.cursorPosition);
}
}
public void moveCursor(int pos) {
list.cursorPosition = pos;
}
public void undo() {
if (this.undo.isEmpty() == true) {
return;
}
Node temp = undo.Pop();
redo.Push(temp.getData(), temp.getCursorPosition()); // Day vao redo
list.setCursorPosition(temp.getCursorPosition());
if (temp.getData() == '\b') {
list.InsertAtPostion(temp.getData(), list.getCursorPosition());
} else {
list.DeleteAtPosition(list.getCursorPosition());
}
}
public void redo() {
if (this.redo.isEmpty() == true || list.cursorPosition == 0) {
return;
}
Node temp = redo.Pop();
undo.Push(temp.getData(), temp.getCursorPosition());
list.setCursorPosition(temp.getCursorPosition());
if (temp.getData() == '\b') {
list.InsertAtPostion(temp.getData(), list.getCursorPosition());
} else {
list.DeleteAtPosition(list.getCursorPosition());
}
}
public char[] show() {
String s = list.show();
return s.toCharArray();
}
}
Editor is loading...