文档章节

自定义自增序列

不愿透露姓名的Mr成
 不愿透露姓名的Mr成
发布于 2017/09/09 20:17
字数 793
阅读 34
收藏 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成
粉丝 6
博文 4
码字总数 1865
作品 3
郑州
高级程序员
私信 提问
短网址(short URL)系统的原理及其实现

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

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

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

一直在成长的程序猿
2018/04/11
0
0
PostgreSQL --序列与自增id的秘密

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

朱飞东
2018/06/26
0
0
Oracle开发的几个解决方案-自增序列

新项目需要用Oracle 数据库,之前到用过好几个数据库,就是没有用过Oracle,总觉得在互联网方面的开发,选用Oracle太过重量级,这次也是客户要求。 这里整理些非常基础的开发技巧。高手绕道 ...

从前
2013/12/27
0
0
Oracle 10G中关于序列使用详解.

Oracle 10G中关于序列使用详解. 数据库设计的三大范式第一条就是独立的表结构中必须有唯一主键来标识表中数据.在以往微软的SQL Server(duo版本)平台上.手动编码实现表中主键.并设定为自增列是...

猴子
2011/11/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
8
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部