自定义自增序列

先看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);
	}
}

转载于:https://my.oschina.net/yiq/blog/1532386

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值