先看demo吧
//从给定的字符产生自增序列
SimpleSequence seq = new SimpleSequence("一二三四五六七八九");
String ch = seq.nextString("九九九"); // ==> 一 一 一 一
String [] list1 = seq.nextString(3); // ==> [一, 二, 三]
String [] list2 = seq.nextString("九九七", 3); // ==> [九九八, 九九九, 一 一 一 一]
import java.util.HashMap;
import java.util.Map;
/**
* 实现简单的自定义序列
* <p>
* 类似于xx进制的效果 可以用任意的字符做有序排列
* </p>
* <p>
* 例如使用a-z的字符做序列集合,则有 aaa, aab, aac, ... aaz, ab0
* </p>
* <p>
* example:
* </p>
* <code>
* <pre>
* SimpleSequence seq = new SimpleSequence("一二三四五六七八九");
* String ch = seq.nextString("九九九"); // 一一一一
* String [] list1 = seq.nextString(3); // [一, 二, 三]
* String [] list2 = seq.nextString("九九七", 3); // [九九八, 九九九, 一一一一]
* </pre>
* </code>
*
* @author mdc
* @date 2017年7月4日 上午10:40:17
*/
public class SimpleSequence {
/**
* 默认序列集合,包含字符: 0-9a-zA-Z
*/
public static final String DEFAULT_SEQUENCE = "0123456789abcdefghijklmnopqrstuvwxyZABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* 原始序列集合表
*/
private char[] chars;
/**
* 第一个字符
*/
private final char first;
/**
* 最后一个字符
*/
private final char last;
/**
* 字符和索引的映射关系
*/
private final Map<Character, Integer/* 字符所在的索引值 */> charMapIndex;
/**
* 使用默认的字符序列集合 {@linkplain #DEFAULT_SEQUENCE}
*/
public SimpleSequence() {
this(DEFAULT_SEQUENCE);
}
/**
* 从给定的一组序列集合来生成序列
*
* @param sequence 序列集合,可以是任意的字符
*/
public SimpleSequence(CharSequence sequence) {
this.chars = sequence.toString().toCharArray();
last = chars[chars.length - 1];
first = chars[0];
charMapIndex = new HashMap<Character, Integer>(chars.length) {
private static final long serialVersionUID = 1L;
{
for (int i = 0; i < chars.length; i++) {
put(chars[i], i);
}
}
};
}
/**
* 根据指定的字符获取下一个字符,但该字符必须属于指定的序列集合
*
* @author mdc
* @date 2017年7月4日 上午10:50:58
* @param ch
* @return
*/
public char nextChar(char ch) {
return chars[charMapIndex.get(ch) + 1];
}
/**
* 根据指定的序列获取下序列,其中会自动进制换算,例如从序列0-9中取999的下一个字符为1000
*
* @author mdc
* @date 2017年7月4日 上午10:57:58
* @param seq 给定序列,从序列集合选取的字符序列, 如果为空,则返回第一个字符 类似于从0-9中取字符999
* @return 返回下一个序列字符串
*/
public String nextString(CharSequence seq) {
if (seq == null || seq.equals("")) {
return String.valueOf(first);
}
char[] chars = seq.toString().toCharArray();
int index = chars.length - 1;
while (true) {
if (chars[index] == last) {
if (index - 1 < 0) {
chars[index] = first;
return first + String.valueOf(chars);
}
chars[index--] = first;
continue;
}
chars[index] = nextChar(chars[index]);
return String.valueOf(chars);
}
}
/**
* 根据指定序列生成该序列后的count个序列
*
* @author mdc
* @date 2017年7月4日 上午11:12:07
* @param seq 给定序列,从序列集合选取的字符序列, 类似于从0-9中取字符999
* @param count 生成的序列个数
* @return 生成后的count个序列
*/
public String[] nextString(CharSequence seq, int count) {
String[] list = new String[count];
String seqString = (seq == null) ? null : seq.toString();
for (int i = 0; i < count; i++) {
seqString = nextString(seqString);
list[i] = seqString;
}
return list;
}
/**
* 从第一个字符生成count个序列
*
* @author mdc
* @date 2017年7月4日 上午11:12:07
* @param count 生成的序列个数
* @return 生成后的count个序列
*/
public String[] nextString(int count) {
return nextString(null, count);
}
}