文档章节

自定义自增序列

不愿透露姓名的Mr成
 不愿透露姓名的Mr成
发布于 2017/09/09 20:17
字数 793
阅读 30
收藏 0

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

© 著作权归作者所有

共有 人打赏支持
不愿透露姓名的Mr成
粉丝 5
博文 4
码字总数 1865
作品 3
郑州
高级程序员
短网址(short URL)系统的原理及其实现

背景 提供一个短址服务 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?如果有一个短址生成器就好了。虽然市面上有很多,但是我们可以重复发明一个轮子,利用这个机会尝试一下简单的 ...

琯琯
01/20
0
0
mybatis,mapper.xml文件书foreach使用

最近工作中使用mybatis自定义SQL时用到了foreach循环(oracle数据库),但是如下书写不好用:

一直在成长的程序猿
04/11
0
0
理解JPA注解@GeneratedValue

一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法,...

一生只为虞美人
07/25
0
0
mysql InnoDB UUID 主键 性能优化【原理篇】.md

mysql InnoDB uuid 主键 性能优化【原理篇】.mdmysql InnoDB UUID 主键 性能优化【实践篇】.md 有序uuidmysql InnoDB UUID 主键 性能优化【原理篇】.mdmysql InnoDB UUID 主键 性能优化【性能...

北京起航
2015/05/22
0
0
PostgreSQL --序列与自增id的秘密

一、PostgreSQL的自增id serial 1.2、serial的本质 我们在创建表时,经常需要使用到自增id,往往这么写, 1.2、序列的属性 因为自增本质上是取序列发生器的下一个值,所以可以多个表共用一个...

朱飞东
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

马太效应

马太效应

yizhichao
13分钟前
0
0
69.for while循环 continue break exit

20.10 for循环 20.11/20.12 while循环 20.13 break跳出循环 20.14 continue结束本次循环 20.15 exit退出整个脚本 扩展 select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.10......

王鑫linux
22分钟前
0
0
完整的软件开发流程是怎样的

在it圈混迹了这么久,做过各种各样的工作。但是我确一直不知道一个软件从无到有到底是怎么开发的。于是就产生了强烈的好奇心:一个软件产品的结果为什么是这样?为什么开发的速度不能再快一点...

TreasureWe
28分钟前
0
0
深度学习与图像处理之:人像背景虚化

简单实现思路: 对图像内容进行分割,提取人像 对图像背景进行模糊化处理 将人像和背景重新合成 在这里,使用DeepLabV3模型对图像内容进行分割并提取人像,实现的代码如下: import numpy a...

IOTService
30分钟前
0
0
20180918上课截图

小丑鱼00
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部