有时我们需要使用数组批量创建测试数据,接下来通过以下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. GDB调试器教程

    启动和退出GDBGDB(GNU Project Debugger)几乎适用于所有类Unix系统,小巧方便且不失功能强大,Linux/Unix程序员经常用它来调试程序. 总的来说有几下几种方法启动GDB ...

  2. CF827D Best Edge Weight[最小生成树+树剖/LCT/(可并堆/set启发式合并+倍增)]

    题意:一张图求每条边边权最多改成多少可以让所有MST都包含这条边. 这题还是要考察Kruskal的贪心过程. 先跑一棵MST出来.然后考虑每条边. 如果他是非树边,要让他Kruskal的时候被选入,必 ...

  3. [唐胡璐]Selenium技巧- 抓图并保存到TestNG报告中

    这里不讲解怎么在Eclipse安装配置TestNG,网上一搜一大把,大家自己去实践一下。 在这里主要说一下用Java来实现Selenium Webdriver的截图功能和把截图写到TestNG的报告中 ...

  4. Vue完成页面切换中加载数据

    created() { // 拿到路由传递来的car主键 let pk = this.$route.query.pk || this.$route.params.pk; // 主键不存在,就直接结束方 ...

  5. BZOJ 1453 (线段树+并查集)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1453 题意:一个 n*n 的矩阵,每个位置有黑/白两种颜色,有 m 次操作,每次可以翻转 ...

  6. HDU 5634 (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5634 题意:给出 n 个数,有三种操作,把区间的 ai 变为 φ(ai):把区间的 ai 变为 x:查 ...

  7. [Algorithm] Chunk Array

    // --- Directions// Given an array and chunk size, divide the array into many subarrays// where each ...

  8. CI环境搭建下-Jenkis与git结合

     设置权限:  也可以通过公私钥的方式,添加权限,公私钥填写在gitblit用户中心:  Jenkins中填写私钥: 添加: 添加后如果仍然报错,是因为windows下要使用http的地址. 在此,可 ...

  9. 根据xml文件生成javaBean

    原 根据xml文件生成javaBean 2017年08月15日 18:32:26 吃完喝完嚼益达 阅读数 1727 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出 ...

  10. 微信小程序开发入门教程(四)---自己动手做个小程序

    前面已将基础知识准备的差不多了,下面实际做一个小程序. 一.目标 用于上传照片和文字. 2个主要页面:我me,设置set 二.开始制作 1.打开微信开发者工具(我用的1.02.1907160 Wind ...