`
heisalittlebird
  • 浏览: 20189 次
文章分类
社区版块
存档分类
最新评论

随机产生99条2-10个长度的字符串存入线程安全的集合中然后按格式输出

 
阅读更多
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语言程序设计-对长度为8个字符的字符串,将8个字符按降序排列;例如:原来的字符串为CEAedcab,排序后输出为edcbaE

    C语言程序设计-对长度为8个字符的字符串,将8个字符按降序排列;例如:原来的字符串为CEAedcab,排序后输出为edcbaE

    字符串比较问题对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格

    对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离为一定值k。 在一般情况下,字符串A和B的...

    php 随机生成10位字符代码

    函数体内部使用了`rand()`函数来生成一个随机数,结合`strlen($chars)`来获取字符集合的长度,从而保证可以随机选中`$chars`字符串中的任意位置。`substr($chars, $position, 1)`则用于从`$chars`中截取长度为1的...

    逆序输出(字符串)

    对于初学者来说,理解字符串处理的基础操作是至关重要的,而逆序输出作为字符串处理的一个典型例子,不仅有助于加深对字符串的理解,还能锻炼逻辑思维能力。 #### 核心代码分析 首先,我们来详细分析给出的示例...

    c语言-输出格式输出提取出来的数字字符串,每个连续数字字符串占一行

    #c语言#的问题:输出格式输出提取出来的数字字符串,每个连续数字字符串占一行(相关搜索:字符串长度|输入字符串 #c语言#的问题:输出格式输出提取出来的数字字符串,每个连续数字字符串占一行(相关搜索:字符串...

    生成指定长度的随机字符串

    在IT领域,生成指定长度的随机字符串是一项常见的需求,它广泛应用于密码生成、测试数据填充、安全令牌等领域。本文将深入探讨如何生成这样的随机字符串,并介绍相关编程语言的实现方法。 首先,我们要理解随机字符...

    pb字符串长度格式化

    "pb字符串长度格式化"这个主题关注的是如何调整字符串的长度,使其符合特定的标准,这通常涉及到字符串的截取、填充以及转换等操作。在编程语言如PowerBuilder(PB)中,这类操作对于数据展示、数据库交互以及遵循...

    随机生成32位字符串

    在这个场景中,"随机生成32位字符串"是一个常见的需求,例如在创建唯一标识符、生成安全密码或进行加密算法时。下面将详细介绍如何在VB中实现这一功能。 首先,我们要了解VB中的字符串是由一系列字符组成的,每个...

    C# 生成随机字母字符串

    因此,我们可以创建一个函数,接受一个整数参数来决定字符串的长度,并使用`Random`类来生成随机的ASCII码值,然后将其转换为对应的字母。 以下是一个简单的示例代码,用于生成随机大小写字母字符串: ```csharp ...

    java 字符串分割

    2. 然后,我们使用 for 循环将输入字符串分割成多个子字符串,每个子字符串的长度为 10 个字符。 3. 最后,我们使用 ArrayList 集合来存储分割后的子字符串,并将其倒序输出。 知识点四:Java 中的 ArrayList 集合 ...

    CLOB 字段类型报错 ORA-01704: 文字字符串过长的解决

    这个错误通常意味着你试图插入的字符串超过了Oracle数据库允许的最大长度,对于VARCHAR2类型,这个限制是4000个字符;而对于CLOB类型,虽然没有硬性长度限制,但一次PL/SQL语句中的绑定变量值不能超过4000个字符。 ...

    labview字符串创建数组

    - **字符到字符串数组**:如果你有字符数组,可以使用“字符数组到字符串”函数,将每个字符数组元素转换为单独的字符串,然后用“数组构造函数”组合它们。 4. **操作字符串数组**: - **数组操作函数**:...

    C#随机字符串生成代码

    本篇将深入探讨如何在C#中生成指定长度、包含字母或数字或者两者的混合随机字符串。 首先,我们需要了解C#中用于生成随机数的`System.Random`类。这个类提供了生成伪随机数的方法,可以通过种子初始化以获得不同的...

    随机生成不重复字段-自定义各个字段长度(陈表达原创).xlsm

    批量随机生成多个不重复多段字符串(每个段可自定义长度) 哪个字段有输入长度,即为生成多少段字符 1、生成10组长度为1的随机数据 2、生成10组长度为1的,两个段2个数据 3、生成10组长度为2的,2个段的数据 4、生成...

    输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())

    输入一个长度不超过100的字符串,求出这个字符串的长度(不能使用strlen())

    控制台应用程序,接受字符串大于3的字符串并实现一些功能

    2:输出字符串中第一个出现字母a的位置 3:在字符串的第3个字符后面插入字符串“hello”,输出新字符串. 4:将字符串“hello”替换为“me”,输出新的字符串 5:以字符"m"为分隔符,将字符串分离,并输出分离后的字符...

    使用strtok函数截取字符串得到相应的子串存入数组中

    在C/C++编程中,`strtok`函数是一种常用的字符串处理工具,用于将字符串分割成多个子串。这个函数在处理复杂格式的数据时非常有用,比如解析包含多种数据类型的字符串。在给定的场景中,我们需要从一个字符串中提取...

Global site tag (gtag.js) - Google Analytics