package ruc.irm.similarity.sentence.editdistance;
public class Block<T> {
private int globalPosition;
/** 块的内容 */
private SuperString<T> data;
/** 前后指针 */
private Block<T> prev, next;
/** 是否已经进行划分 */
private boolean divideFlag = false;
public Block(SuperString<T> string){
this.data = string;
this.globalPosition = 0;
}
public Block(SuperString<T> string, int globalBegin){
this.data = string;
this.globalPosition = globalBegin;
}
public int getGlobalPosition() {
return globalPosition;
}
public void setGlobalPosition(int globalPosition) {
this.globalPosition = globalPosition;
}
public SuperString<T> getData() {
return data;
}
public void setData(SuperString<T> data) {
this.data = data;
}
public Block<T> getPrev() {
return prev;
}
public void setPrev(Block<T> prev) {
this.prev = prev;
}
public Block<T> getNext() {
return next;
}
public void setNext(Block<T> next) {
this.next = next;
}
public boolean isDivideFlag() {
return divideFlag;
}
public void setDivideFlag(boolean divideFlag) {
this.divideFlag = divideFlag;
}
public void divide(int start, int length){
if(start==0 && length==data.length()){
this.divideFlag = true;
return;
}else if(start==0){
//前面为已经分割的标记,后面应该为未分割的标记
Block<T> tail = new Block<T>(data.substring(length), globalPosition + start);
this.setDivideFlag(true);
this.setData(data.substring(0, length));
tail.next = this.next;
if(tail.next!=null) tail.next.prev = tail;
this.next = tail;
tail.prev = this;
}else if(start+length == data.length()){
//后面为已经分割的标记,前面应该为未分割的标记
Block<T> head = new Block<T>(data.substring(0, start), globalPosition);
this.setDivideFlag(true);
this.setData(data.substring(start));
head.prev = this.prev;
if(head.prev!=null) head.prev.next = head;
head.next = this;
this.prev = head;
}else{
//中间为已经分割的标记,前面和后面应该为未分割的标记
Block<T> head = new Block<T>(data.substring(0, start), globalPosition);
Block<T> tail = new Block<T>(data.substring(start+length), globalPosition + start+length);
this.setDivideFlag(true);
this.setData(data.substring(start, start+length));
this.setGlobalPosition(globalPosition + start);
head.prev = this.prev;
if(head.prev!=null) head.prev.next = head;
head.next = this;
this.prev = head;
tail.next = this.next;
if(tail.next!=null) tail.next.prev = tail;
this.next = tail;
tail.prev = this;
}
}
}