功能需求:
1,根据章节和当前标题数量,获得下一个编号,满足不同等级编号需求.如同word中的自动编号功能一样
2,可以实现在freemarker中直接调用生成方法,得到正确的编号
目标:即在freemarker代码中通过一个方法调用即可得到当前章节的编号
1
1.1
1.2
2
2.1
2.1.1
2.1.2
2.2
2.2.1
3
3.1
3.1.1
3.1.1.1
3.2
思路:
1,编号整体上是树形结构,因此要用树来管理整个列表
2,有一个方法可以根据最大值,获取下一个(比如:最大值3,下一个4,最大值四,下一个五),这种增量方式是可以扩展和重新定义的.
3,章节间的分隔符是可以指定的,在定义过程中应该指定.
不多说,上代码:
public abstract class Number {
public abstract String produceNext(String crrnt);
public String rootNumber() {
return "0";
}
public String firstNumber() {
return "1";
}
}编号抽象类,定义编号的元素类(如1,2,3或一,二,三)
实现类:
public class SerialNumber extends Number {
@Override
public String produceNext(String crrnt) {
String next = "0";
if (crrnt != null) {
try {
int crrntNum = Integer.parseInt(crrnt);
next = String.valueOf(crrntNum + 1);
} catch (Exception e) {
System.err.println("非数字类型的字符串!");
}
}
return next;
}
}
节点类:
public class Node implements Comparable {
private String id;
private String number;
private String text;
private String parentId;
private int level;
public Node(String id, String number, String parentId, int level) {
this.id = id;
this.number = number;
this.parentId = parentId;
this.level = level;
}
public Node() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override