有时我们需要使用数组批量创建测试数据,接下来通过以下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. 【小知识】证明 $1$ 到 $n$ 的立方和公式

    scb 发明了小学奥数(确信) Formula \(\sum\limits_{i=1}^n i^3 = (\sum\limits_{i=1}^n i)^2\) Provement 构造一个矩阵 \(a ...

  2. docker化canal与canal-adapter

    今日公司需求,需要将mysql更新实时同步到kafka中,后来又要将数据库中的一张表的变化实时同步到另一台mysql中,于是乎canal与canal-adapter紧急解决,其中踩了不少坑,下面为总结 ...

  3. python之collections模块(nametuple,Counter)

    前言: import collections print([name for name in dir(collections) if not name.startswith("_" ...

  4. Java日期工具类DateUtils详解(转)

    jar包 appache下的 common-lang3 一. 对指定的日期新增年.月.周.日.小时.分钟.秒.毫秒 public static Date addDays(Date date, int ...

  5. list深拷贝和浅拷贝

    在Python中,经常要对一个list进行复制.对于复制,自然的就有深拷贝与浅拷贝问题.深拷贝与浅拷贝的区别在于,当从原本的list复制出的list之后,修改其中的任意一个是否会对另一个造成影响,即这 ...

  6. jQuery系列(十一):jQuery的事件绑定和解绑

    1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data ( ...

  7. 【集训队作业2018】count

    CSP后第一发Blog. 这道题没有一下子过掉,开始还推出了错的结论.在错误的生成函数里绕了好久-- 很显然的转笛卡尔树,一个笛卡尔树对应一种序列.只要考虑一个笛卡尔树是否合法. 贪心地填数发现,从根 ...

  8. poj1275

    Cashier Employment POJ - 1275 A supermarket in Tehran is open 24 hours a day every day and needs a n ...

  9. Python图形用户界面-Tkinter

    Tkinter是什么 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多一个直观的功能,如何想开发一个计算器,如果 ...

  10. LG5283 异或粽子

    题意 共有\(n\)个数,选择\(k\)个不同的\([l,r]\)区间,使得它们的异或和最大 $ 1 \leq n \leq 5 \times 10^5,k \leq 2 \times 10^5$ 思 ...