`
vortexchoo
  • 浏览: 64287 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

不用其他jar包,获取随机排列数组。

    博客分类:
  • java
 
阅读更多
/*
* 网上看到一道题,挺有意思。记录下来。
*/

package array;


public class RandomArray<T> {
	
	private T[] array;
	
	private Object[] result;
	
	private Integer count = 0;
	
	private T[] getArray() {
		return array;
	}

	private void setArray(T[] array) {
		this.array = array;
		Integer size = 1;
		for (Integer i = array.length; i >= 1; i --) {
			size *= i;
		}
		System.out.println("result size = " + size);
		this.result = new Object[size];
	}
	
	private Object[] getResult() {
		return result;
	} 
	
	private void putElementToResult(T[] array) {
		result[count] = array;
	}
	
	private RandomArray (T[] array) {
		this.setArray(array);
	}

	private void exchange (Integer originalIndex, Integer destinationIndex) {
		if (originalIndex.compareTo(destinationIndex) == 0) { 
			return;
		}
		T[] array = this.getArray();
		T temp = array[originalIndex];
		array[originalIndex] = array[destinationIndex];
		array[destinationIndex] = temp;
	}
	
	private Object[] copyArray(T[] array) {
		Object[] objs = new Object[array.length];
		for (Integer i = 0; i < array.length; i++) {
			objs[i] = array[i];
		}
		return objs;
	}
	
	private void arrayHandler (Integer startIndex, Integer endIndex) {
		if (startIndex.compareTo(endIndex) != 0) {
			for(Integer i = startIndex; i <= endIndex; i ++ ) {
				exchange(startIndex, i);
				arrayHandler(startIndex + 1, endIndex);
				exchange(i, startIndex);
			}
		} else {
			@SuppressWarnings("unchecked")
			T[] param = (T[]) copyArray(array);
			this.putElementToResult(param);
			this.count ++;
		}
	}
	
	private Integer getRandomNumber() {
		Integer countLength = count.toString().length();
		while(true) {
			Long currentMillis = System.currentTimeMillis();
			String compareVal = currentMillis.toString().substring(currentMillis.toString().length() - countLength);
			Integer number = getValidNumber(compareVal);
			if (number <= count) {
				return number;
			}
		}
	}
	
	private Integer getValidNumber(String compareVal) {
		if ("0".equals(compareVal)) {
			return 0;
		} else if(compareVal.startsWith("0")) {
			compareVal = compareVal.replaceFirst("0", "");
			return getValidNumber(compareVal);
		} else {
			return Integer.valueOf(compareVal);
		}
	}
	
	@SuppressWarnings("unchecked")
	private T[] convertObjectArrayToGenericArray(Object[] data, T[] container) {
		for(Integer i = 0; i < data.length; i ++) {
			container[i] = (T) data[i];
		}
		return container;
	}
	
	public T[] getRandomArray(T[] container) {
		arrayHandler(0,this.getArray().length - 1);
		Object[] _this = this.getResult();
		Integer indexNumber = getRandomNumber();
		Object[] objs = (Object[]) _this[indexNumber];
		return convertObjectArrayToGenericArray(objs, container);
	}
	public static void main(String[] args) {
                /*
                 *test
                 */
		String[] array = {"1","2","3"};
		RandomArray<String> ran = new RandomArray<String>(array);
		String[] randomArray = ran.getRandomArray(new String[3]);
		for (String str: randomArray) {
			System.out.print(str + " ");
		}
	}
}

 

分享到:
评论

相关推荐

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包---java 源码 大量 实例

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例044 利用数组随机抽取幸运观众 54 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例048 复选框控件数组 59 实例049 用数组...

    JAVA上百实例源码以及开源项目源代码

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

Global site tag (gtag.js) - Google Analytics