自定义自增序列
自定义自增序列
不愿透露姓名的Mr成 发表于3个月前
自定义自增序列
  • 发表于 3个月前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

华为云·免费上云实践>>>   

摘要: 在一个项目中需要用到一个功能, 就是根据0-9A-z的字符做自增,生成字符串。 比如aaz, ab0, ab1, ab2...azz, b00,类似于这样自增序列。这篇文章就是把这个实现记录下来。

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

共有 人打赏支持
粉丝 4
博文 4
码字总数 1865
作品 2
×
不愿透露姓名的Mr成
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: