`
vortexchoo
  • 浏览: 67502 次
  • 性别: 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中使用`Random`类或其他方式生成0到1000之间的随机整数。 - **知识点2:循环结构** - 使用循环结构来不断提示用户猜测数字,直到猜中为止。 - **知识点3:控制台输入输出** - 从控制台读取用户的猜测,...

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

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

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

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

    成百上千个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