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
java代码-使用java输入一个长度不超过30的字符串然后再输入一个字符输出该字符在字符串中出现的次数的源代码 ——学习参考资料:仅用于个人学习使用!
C语言程序设计-对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列;例如:原来的字符串为CEAedca,排序后输出为CedcEAa;.c
函数体内部使用了`rand()`函数来生成一个随机数,结合`strlen($chars)`来获取字符集合的长度,从而保证可以随机选中`$chars`字符串中的任意位置。`substr($chars, $position, 1)`则用于从`$chars`中截取长度为1的...
对于初学者来说,理解字符串处理的基础操作是至关重要的,而逆序输出作为字符串处理的一个典型例子,不仅有助于加深对字符串的理解,还能锻炼逻辑思维能力。 #### 核心代码分析 首先,我们来详细分析给出的示例...
#c语言#的问题:输出格式输出提取出来的数字字符串,每个连续数字字符串占一行(相关搜索:字符串长度|输入字符串 #c语言#的问题:输出格式输出提取出来的数字字符串,每个连续数字字符串占一行(相关搜索:字符串...
在这个场景中,"随机生成32位字符串"是一个常见的需求,例如在创建唯一标识符、生成安全密码或进行加密算法时。下面将详细介绍如何在VB中实现这一功能。 首先,我们要了解VB中的字符串是由一系列字符组成的,每个...
因此,我们可以创建一个函数,接受一个整数参数来决定字符串的长度,并使用`Random`类来生成随机的ASCII码值,然后将其转换为对应的字母。 以下是一个简单的示例代码,用于生成随机大小写字母字符串: ```csharp ...
2. 然后,我们使用 for 循环将输入字符串分割成多个子字符串,每个子字符串的长度为 10 个字符。 3. 最后,我们使用 ArrayList 集合来存储分割后的子字符串,并将其倒序输出。 知识点四:Java 中的 ArrayList 集合 ...
java语言输出10个随机字符串代码正确版.txt
这个错误通常意味着你试图插入的字符串超过了Oracle数据库允许的最大长度,对于VARCHAR2类型,这个限制是4000个字符;而对于CLOB类型,虽然没有硬性长度限制,但一次PL/SQL语句中的绑定变量值不能超过4000个字符。 ...
批量随机生成多个不重复多段字符串(每个段可自定义长度) 哪个字段有输入长度,即为生成多少段字符 1、生成10组长度为1的随机数据 2、生成10组长度为1的,两个段2个数据 3、生成10组长度为2的,2个段的数据 4、生成...
输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())
本题目通过一个简单的字符串长度统计程序介绍了字符串的基本操作方法,包括如何读取字符串、计算字符串长度以及基本的输入输出控制。对于初学者来说,这是一个很好的练习,能够帮助他们更好地理解字符串的概念和使用...
# 给你一个字符串a和一个正整数n,判断a中是否存在长度为n的回文子串。 # 如果存在,则输出YES,否则输出NO。 # 回文串的定义:记串str逆序之后的字符串是str1,若str=str1,则称str是回文串,如"abcba". # 输入...
该字母表产生的升序字符串是指字符串中字母按照从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1 次。例如,a,b,ab,bc,xyz 等字符串都是升序字符串。现在对字母表A 产生的所有长度不超过6 的...
在C/C++编程中,`strtok`函数是一种常用的字符串处理工具,用于将字符串分割成多个子串。这个函数在处理复杂格式的数据时非常有用,比如解析包含多种数据类型的字符串。在给定的场景中,我们需要从一个字符串中提取...
- 程序首先提示用户输入第一个字符串(关键词),然后读取并保存至 `key_word` 数组中。 - 接着提示用户输入第二个字符串(句子),同样地读取并保存至 `sentence` 数组中。 2. **字符串比较与匹配**: - 程序...