有时我们需要使用数组批量创建测试数据,接下来通过以下4点来举例。

(1) 使用Arrays.fill()填充数据

(2) 使用Random类中JDK1.8提供的新方法用来生成随机数

(3) 一个随机数生成器的实例

(4) 根据(3)中的随机数生成器创建包装类型的数组及通过转换器转换成基本类型的数组

(1) 使用Arrays.fill()填充数据:它可以填充整个数组或填充数组某个区域。另外填充对象时是复制一个引用填充的。

 public class Test1 {
public static void main(String[] args) {
char[] p1 = new char[3];
long[] p2 = new long[4];
String[] p3 = new String[5];
Arrays.fill(p1, 'b');
Arrays.fill(p2, 5L);
Arrays.fill(p3, "Hello");
System.out.println(Arrays.toString(p1)); // [b, b, b]
System.out.println(Arrays.toString(p2)); // [5, 5, 5, 5]
System.out.println(Arrays.toString(p3)); // [Hello, Hello, Hello, Hello, Hello]
Arrays.fill(p3, 4, 5, "World");
System.out.println(Arrays.toString(p3)); // [Hello, Hello, Hello, Hello, World]
}
}

(2) 使用Random类中JDK1.8提供的新方法用来生成随机数

 public class Test2 {
public static void main(String[] args) {
Random random = new Random();
int[] arr = random.ints(10).toArray(); // 生成10个int范围类的个数。
System.out.println(Arrays.toString(arr));
random.ints().limit(10).forEach(System.out::println); // 生成10个int范围类的个数(先生成无限个再截取10个)。
random.longs(5, 10, 100).forEach(System.out::println); // 生成5个在[10,100)范围内的整数
random.longs(10, 100).limit(5).forEach(System.out::println); // 生成5个在[10,100)范围内的整数(先生成无限个再截取10个)。
}
}

(3) 一个随机数生成器的实例:因为Random构造器使用常量初始化,所以,每次使用这些Generator中的一个来运行程序时,所产生的输出都是可重复的。

 import java.util.Random;

 interface Generator<T> { T next(); }

 class RandomGenerator {

     // 对于有参构造,需要注意的是,如果seed(种子)值相同,不管执行多少次,随机生成的数据是相同的
private static Random r = new Random(47); // Boolean Generator
public static class GenBoolean implements Generator<Boolean> {
@Override
public Boolean next() {
return r.nextBoolean(); // return next(1) != 0; 想生成范围在[0,1]的整数
}
} // Byte Generator
public static class GenByte implements Generator<Byte> {
@Override
public Byte next() {
return (byte) r.nextInt(); // 随机生成一个整数,范围就是int类型的范围-2^31~2^31-1,这里会强制截取后8 bit作为byte值
}
} // Character Generator
public static class GenCharacter implements Generator<Character> { private static char[] chars = ("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray(); @Override
public Character next() {
return chars[r.nextInt(GenCharacter.chars.length)]; // 生成范围在[0, chars.length)的整数
}
} // String Generator
public static class GenString implements Generator<String> {
private int length = 7;
Generator<Character> cg = new GenCharacter(); public GenString() {
} public GenString(int length) {
this.length = length;
} @Override
public String next() {
char[] buf = new char[length];
for (int i = 0; i < length; i++)
buf[i] = cg.next();
return new String(buf);
}
} // Short Generator
public static class GenShort implements Generator<Short> { @Override
public Short next() {
return (short) r.nextInt(); // 随机生成一个整数,范围就是int类型的范围-2^31~2^31-1,这里会强制截取后16 bit作为byte值
}
} // Integer Generator
public static class GenInteger implements Generator<Integer> {
private int mod = 10000; public GenInteger() {
} public GenInteger(int modulo) {
mod = modulo;
} @Override
public Integer next() {
return r.nextInt(mod); // 随机生成一个整数,默认范围是[0, 10000)
}
} // Long Generator
public static class GenLong implements Generator<Long> {
private int mod = 10000; public GenLong() {
} public GenLong(int modulo) {
mod = modulo;
} @Override
public Long next() {
return new Long(r.nextInt(mod));// 随机生成一个整数,默认范围是[0, 10000)
}
} // Float Generator
public static class GenFloat implements Generator<Float> {
@Override
public Float next() {
int trimmed = Math.round(r.nextFloat() * 100);
return ((float) trimmed) / 100;
}
} // Double Generator
public static class GenDouble implements Generator<Double> {
@Override
public Double next() {
long trimmed = Math.round(r.nextDouble() * 100);
return ((double) trimmed) / 100;
}
}
} public class Test3 {
public static void main(String[] args) {
Generator<Boolean> a = new RandomGenerator.GenBoolean();
Generator<Integer> b = new RandomGenerator.GenInteger();
Generator<Float> c = new RandomGenerator.GenFloat();
generate(a, 5); // true false true false false
generate(b, 5); // 429 4868 200 4522 6207
generate(c, 5); // 0.27 0.95 0.26 0.11 0.05
} private static <T> void generate(Generator<T> gen, int times) {
for (int i = 0; i < times; i++) {
System.out.print(gen.next() + " ");
}
System.out.println();
}
}

(4) 根据(3)中的随机数生成器创建包装类型的数组及通过转换器转换成基本类型的数组

> 创建包装类型的数组

> 由于泛型不支持基本类型,如果想用生成器填充基本类型的数组,还需要创建一个转换器

 import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays; class CollectionData<T> extends ArrayList<T> { private static final long serialVersionUID = 1L; public CollectionData(Generator<T> gen, int quantity) {
for (int i = 0; i < quantity; i++)
add(gen.next());
} public static <T> CollectionData<T> list(Generator<T> gen, int quantity) {
return new CollectionData<T>(gen, quantity);
}
} class Generated {
// Fill an existing array:
public static <T> T[] array(T[] a, Generator<T> gen) {
return new CollectionData<T>(gen, a.length).toArray(a);
} // Create a new array:
public static <T> T[] array(Class<T> type, Generator<T> gen, int size) {
@SuppressWarnings("unchecked")
T[] a = (T[]) Array.newInstance(type, size);
return new CollectionData<T>(gen, size).toArray(a);
}
} class ConvertTo {
public static boolean[] primitive(Boolean[] in) {
boolean[] result = new boolean[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static char[] primitive(Character[] in) {
char[] result = new char[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static byte[] primitive(Byte[] in) {
byte[] result = new byte[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static short[] primitive(Short[] in) {
short[] result = new short[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static int[] primitive(Integer[] in) {
int[] result = new int[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static long[] primitive(Long[] in) {
long[] result = new long[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static float[] primitive(Float[] in) {
float[] result = new float[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
} public static double[] primitive(Double[] in) {
double[] result = new double[in.length];
for (int i = 0; i < in.length; i++)
result[i] = in[i];
return result;
}
} public class Test4 {
public static void main(String[] args) {
Integer[] a = Generated.array(new Integer[5], new RandomGenerator.GenInteger());
System.out.println(Arrays.toString(a)); // [9258, 555, 6693, 1861, 961]
Long[] b = Generated.array(Long.class, new RandomGenerator.GenLong(), 5);
System.out.println(Arrays.toString(b)); // [429, 4868, 200, 4522, 6207] int[] c = ConvertTo.primitive(a);
System.out.println(Arrays.toString(c)); // [9258, 555, 6693, 1861, 961]
long[] d = ConvertTo.primitive(b);
System.out.println(Arrays.toString(d)); // [429, 4868, 200, 4522, 6207]
}
}

Java数组(3):创建测试数据的更多相关文章

  1. Java数组声明创建和使用以及多维数组、Arrays类、稀疏数组

    目录 数组概述 数组声明创建 内存分析 java内存分析 堆 栈 方法区 三种初始化 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 小结: 数组使用 数组基础使用 For E ...

  2. Java 数组的创建

    与C.C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度. 定义一个数组有两种方式: int[] array; int array[]; 对于如上定 ...

  3. Java数组的创建和初始化

    我们说到数组,可能有的人就会比较害怕了,其实,数组只是把对象序列(很多个对象)或者基本类型序列(很多个基本类型)放在一起而已.数组是通过方括号下标操作符[]来定义和使用的.如果要定义,创建一个数组,只 ...

  4. Java学习小结(1)-数组的创建与传参

    (一)数组的创建 数组的创建包括两部分:数组的申明与分配内存空间. int score[]=null; //申明一维数组 score=new int[3]; //分配长度为3的空间 数组的申明还有另外 ...

  5. java数组的声明、创建和遍历

    一.数组的声明.创建 1.一维数组 先是声明 dataType[] arrayRefVar; // 首选的方法 数据类型[] 数组名; dataType arrayRefVar[]; // 效果相同, ...

  6. java数组创建

    java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小

  7. Java 数组的三种创建方法,数组拷贝方法

    public static void main(String[] args) {//创建数组的第一种方法int[] arr=new int[6];int intValue=arr[5];//Syste ...

  8. Java反射04 : 通过Array动态创建和访问Java数组

    java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作. 本文转载自:https://blog.csdn.net/hanchao5272/article/ ...

  9. Java中数组的创建

    Java中数组的使用 1.普通数组变量的定义: //数组 //1.数组是Java中很重要的一部分,今天对数组进行了大致的了解,Java中的数组和C中数组还是有一定的区别的 //以下是总结的几种方法 p ...

随机推荐

  1. 遍历二叉树 - 基于栈的DFS

    之前已经学过二叉树的DFS的遍历算法[http://www.cnblogs.com/webor2006/p/7244499.html],当时是基于递归来实现的,这次利用栈不用递归也来实现DFS的遍历, ...

  2. 2019牛客暑期多校训练营(第一场)E ABBA

    题意问你有多少个长度为2*(n+m)的字符串满足A和B数量相等 且可以分割为n个AB子序列和m个BA子序列 很容易得出前n个A肯定是可以给AB的 后面的m个A给BA 所以当一个字符串满足条件时要满足任 ...

  3. pip报错以及指向错误

    在终端中输入无论是pip3 -V或是pip -V都指向python3 如下图所示: 然后在卸载或更新pip 时都出现了报错: 就是卸载也卸不了更新也更不了 解决报错: Traceback (most ...

  4. 《深入理解Java虚拟机》之(二、垃圾收集器与内存分配策略)

    程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭,这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了,而java堆和方法区 ...

  5. Codeforces Round #589 (Div. 2) D. Complete Tripartite(染色)

    链接: https://codeforces.com/contest/1228/problem/D 题意: You have a simple undirected graph consisting ...

  6. UTF-8 无 BOM

    [参考] UTF8最好不要带BOM,附许多经典评论 Visual Studio UTF-8 无 BOM 一站式解决办法https://blog.csdn.net/dolphin98629/articl ...

  7. MFC 下拉框Combo Box

    下拉框常用的事件是Change事件.属性常用:Data(英文;分隔),Sort(是否排序) // OnInitDialog()中 m_cbx.SetCurSel();//设置默认选项 //OnBnCl ...

  8. 【转】pe结构详解

    (一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...

  9. (vue.js)Vue element tab 每个tab用一个路由来管理?

    (vue.js)Vue element tab 每个tab用一个路由来管理? 来源:网络整理     时间:2017/5/13 0:24:01     关键词:   关于网友提出的“ (vue.js) ...

  10. 「BZOJ 4565」「HAOI 2016」字符合并「区间状压DP」

    题意 给一个长度为\(n(\leq 300)\)的\(01\)串,每次可以把\(k(\leq 8)\)个相邻字符合并,得到新字符和一定分数,最大化最后的得分 题解 考虑设计dp:\(dp[S][i][ ...