package com.random;
import java.util.ArrayList;
public class RandomPwd
{
private static RandomPwd pwd = null;
/**
* 供随机选择的数字
*/
private static final String figures = new String("1234567890");
/**
* 供随机选择的大小写字母
*/
private static final String chars = new String(
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
/**
* 供随机选择的字母
*/
private static final String s = new String(
"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
/**
* 数字字符串的长度
*/
private static final int figureLen = 10;
/**
* 大小写字母字符串的长度
*/
private static final int charLen = 52;
/**
* 随机对象
*/
private static final Random random = new Random();
/**
* 产生2-10位同时有数字和字母的字符串
*
* @return StringBuffer
*/
private StringBuffer randmomStr()
{
StringBuffer temp = new StringBuffer();
int charNumOfTemp = 0;
int figureNumOfTemp = 0;
// false标记产生数字,true标记产生字母
boolean flag = false;
// 产生的字符串长度2-10
int pwdLen = random.nextInt(9) + 2;
for (int i = 0; i < pwdLen; i++)
{
flag = random.nextBoolean();
// 产生的字符中不能全是字母或者数字,至少最后一位是数字或字母
if ((flag || ((figureNumOfTemp + 1) == pwdLen))
&& ((charNumOfTemp + 1) < pwdLen))
{
temp.append(chars.charAt(random.nextInt(charLen)));
charNumOfTemp++;
}
else
{
temp.append(figures.charAt(random.nextInt(figureLen)));
figureNumOfTemp++;
}
}
return temp;
}
/**
* 随机产生2-8字母或者字母的字符串
*
* @return
*/
private StringBuffer randomChars()
{
StringBuffer sb = new StringBuffer();
int len = random.nextInt(9) + 2;
int sLen = 62;
for (int i = 0; i < len; i++)
{
sb.append(s.charAt(random.nextInt(sLen)));
}
return sb;
}
/**
* 交换list2位置的个值
*
* @param array
* @param i
* @param j
*/
private void swap(List<StringBuffer> list, int i, int j)
{
StringBuffer temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
/**
* 判断max是否比min大,按字典 可以用String的compareTo方法代替
*
* @param max
* @param min
* @return
*/
private boolean isMaxThan(StringBuffer max, StringBuffer min)
{
int maxLen = max.length();
int minLen = min.length();
int len = maxLen > minLen ? minLen : maxLen;
for (int i = 0; i < len; i++)
{
if (max.charAt(i) == min.charAt(i))
{
continue;
}
else if (max.charAt(i) > min.charAt(i))
{
return true;
}
else
{
return false;
}
}
// for循环比较完后没有得出结果,则判断max的字符串是否长些
if (maxLen > minLen)
{
return true;
}
else
{
return false;
}
}
/**
* 升序快速排序的分割函数
*
* @param array
* @param low
* @param high
* @return
*/
private int part(List<StringBuffer> list, int low, int high)
{
StringBuffer index = list.get(low);
while (low < high)
{
while (low < high)
{
if (isMaxThan(index, list.get(high)))
{
swap(list, low, high);
break;
}
else
{
high = high - 1;
}
}
while (low < high)
{
if (isMaxThan(list.get(low), index))
{
swap(list, low, high);
break;
}
else
{
low = low + 1;
}
}
}
return low;
}
/**
* 对list通过ASCII码按字典进行快速排序
*
* @param array
* @param low
* @param high
*/
private void charsQuikSortASC(List<StringBuffer> list, int low, int high)
{
if (low < high)
{
int m = part(list, low, high);
charsQuikSortASC(list, low, m);
charsQuikSortASC(list, m + 1, high);
}
}
/**
* 4个字符串一行打印List<StringBuffer>
*
* @param array
*/
private void print(List<StringBuffer> list)
{
for (int i = 0; i < list.size(); i++)
{
StringBuffer s = list.get(i);
System.out.print(s);
// 字符串不满10个用空格填充
for (int j = 0; j <= 10 - s.length(); j++)
{
System.out.print(" ");
}
// 四个字符串一行
if ((i + 1) % 4 == 0)
{
System.out.println("\n");
}
}
}
/**
* 产生99条2-10长度的且同时有数字和字母的字符串。 如果产生的字符串除了最后一位外都是数字或字母则最后一位将添加成字母或数字,
* 以满足字符串中必须有数字和字母的要求。
*
* @return
*/
public List<StringBuffer> general99RandomStr()
{
// 线程安全的ArrayList集合
List<StringBuffer> list = Collections
.synchronizedList(new ArrayList<StringBuffer>(99));
for (int i = 0; i < 9; i++)
{
list.add(randmomStr());
}
return list;
}
/**
* 产生99条2-10长度的且同时包含数字和字母的随机字符串
*
* @return
*/
public List<StringBuffer> general99RandomChars()
{
StringBuffer sb = null;
// 线程安全的ArrayList集合
List<StringBuffer> list = Collections
.synchronizedList(new ArrayList<StringBuffer>(99));
for (int i = 0; i < 99;)
{
sb = randomChars();
// 字符串中同时包含数字和字母且不重复才添加进集合
if (sb.toString()
.matches("([\\d]+[A-Za-z]+).*|([A-Za-z]+[\\d]+).*"))
{
if (!list.contains(sb))
{
list.add(sb);
i++;
}
}
}
return list;
}
/**
* 将集合排序
*
* @param list
*/
public void sortAndPrint(List<StringBuffer> list)
{
charsQuikSortASC(list, 0, list.size() - 1);
}
/**
* 单例
*
* @return
*/
public static synchronized RandomPwd getInstance()
{
if (pwd == null)
{
pwd = new RandomPwd();
}
return pwd;
}
/**
* @param args
*/
public static void main(String[] args)
{
List<StringBuffer> list = getInstance().general99RandomChars();
getInstance().sortAndPrint(list);
getInstance().print(list);
}
}
分享到:
相关推荐
C语言编程-编写函数fun求一个字符串的长度,在main函数中输入字符串,并输出其长度;
C语言程序设计-对长度为8个字符的字符串,将8个字符按降序排列;例如:原来的字符串为CEAedcab,排序后输出为edcbaE
关于objective-c中输出字符串的格式,iphone开发中控制台输出
C语言程序设计-对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列;例如:原来的字符串为CEAedca,排序后输出为CedcEAa;.c
#c语言#的问题:输出格式输出提取出来的数字字符串,每个连续数字字符串占一行(相关搜索:字符串长度|输入字符串 #c语言#的问题:输出格式输出提取出来的数字字符串,每个连续数字字符串占一行(相关搜索:字符串...
从键盘输入10个字符串到一个字符串数组中,按字典顺序对各字符串排序
输入一个字符串,将输出该字符串最长对称子串及其长度,很精巧的算法
C语言编程-编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数;
输入:首先输入数字n,表示要...输出:按长度为8拆分每个字符串后输出到新的字符串数组,长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 样例输入: 2 abc 123456789 样例输出: abc00000 12345678 90000000
对长度为7个的字符串BdsinAD,将字符按ASCII码升序排序,结果ABDdins。
对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离为一定值k。 在一般情况下,字符串A和B的...
Qt 格式化字符串 - Avatarx - 博客园博客园首页新随笔联系管理订阅随笔- 1695 文章- 0 评论- 3Qt 格式化字符串Qt字符串格式化性能比较
C常用库函数-表 数学函数、字符函数、字符串函数、输入输出函数、动态分配函数和随机函数 C常用库函数-表 数学函数、字符函数、字符串函数、输入输出函数、动态分配函数和随机函数 C常用库函数-表 数学函数、字符...
在随意给出的2个字符串中,找出它们共同的最长的子串。 【输入】 输入文件的第一行为一个整数2,接下来有2行,每行为一个字符串,每个字符串的长度均小于255。 【输出】 输出只有一行,即:共同的最长子串,若有多个...
java语言输出10个随机字符串代码正确版.txt
批量随机生成多个不重复多段字符串(每个段可自定义长度) 哪个字段有输入长度,即为生成多少段字符 1、生成10组长度为1的随机数据 2、生成10组长度为1的,两个段2个数据 3、生成10组长度为2的,2个段的数据 4、生成...
基于n-gram中英文字符串分割算法实现
输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())
# 给你一个字符串a和一个正整数n,判断a中是否存在长度为n的回文子串。 # 如果存在,则输出YES,否则输出NO。 # 回文串的定义:记串str逆序之后的字符串是str1,若str=str1,则称str是回文串,如"abcba". # 输入...