文档章节

自定义自增序列

不愿透露姓名的Mr成
 不愿透露姓名的Mr成
发布于 2017/09/09 20:17
字数 793
阅读 29
收藏 0
点赞 0
评论 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
作品 2
郑州
高级程序员
短网址(short URL)系统的原理及其实现

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

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

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

一直在成长的程序猿
04/11
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
Oracle开发的几个解决方案-自增序列

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

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

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

猴子
2011/11/10
0
0
mysql自增字段重排 mysql删除表后自增字段从1开始

MyISAM数据表 删除最大编号的记录后,该编号不可重用。 可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。 可用alter table tablename AUTOINCREMENT=n命令来重设自增的起始值...

BearCatYN
2014/10/14
0
0
MySQL实现序列(Sequence)效果以及在Mybatis中如何使用这种策略

前言: 在oracle中一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长、开始索引、是否循环...

pangfc
2017/01/06
0
0
postgresql重置序列SEQUENCE

以下是在psql下建立一张表: CREATE SEQUENCE increment_num INCREMENT 1 START 1;CREATE TABLE session (userid INT DEFAULT NEXTVAL('incrementnum'),user_name VARCHAR(20),user_email VA......

樂天
2013/11/14
0
0
MySQL把数据删除后id从1开始

用法: CREATE TABLE test ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(15) NOT NULL ) AUTO_INCREMENT = 100; 在数据库应用,我们经常要用到唯一编号,以标识......

netmouse
2016/02/03
121
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
13分钟前
5
0
python上传文件

//注意 <form action="/login/" method="post" enctype="multipart/form-data"> f=request.FILES.get('fafa') ff=open(f.name,mode='wb') for i in f.chunks(): ff.write(i) ff.close()......

南桥北木
25分钟前
0
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
29分钟前
0
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
32分钟前
0
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
44分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
今天
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
今天
1
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
今天
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
今天
1
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部