Java数组(3):创建测试数据
有时我们需要使用数组批量创建测试数据,接下来通过以下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):创建测试数据的更多相关文章
- Java数组声明创建和使用以及多维数组、Arrays类、稀疏数组
目录 数组概述 数组声明创建 内存分析 java内存分析 堆 栈 方法区 三种初始化 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 小结: 数组使用 数组基础使用 For E ...
- Java 数组的创建
与C.C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度. 定义一个数组有两种方式: int[] array; int array[]; 对于如上定 ...
- Java数组的创建和初始化
我们说到数组,可能有的人就会比较害怕了,其实,数组只是把对象序列(很多个对象)或者基本类型序列(很多个基本类型)放在一起而已.数组是通过方括号下标操作符[]来定义和使用的.如果要定义,创建一个数组,只 ...
- Java学习小结(1)-数组的创建与传参
(一)数组的创建 数组的创建包括两部分:数组的申明与分配内存空间. int score[]=null; //申明一维数组 score=new int[3]; //分配长度为3的空间 数组的申明还有另外 ...
- java数组的声明、创建和遍历
一.数组的声明.创建 1.一维数组 先是声明 dataType[] arrayRefVar; // 首选的方法 数据类型[] 数组名; dataType arrayRefVar[]; // 效果相同, ...
- java数组创建
java数组创建:int[] number = new int[10]; int[]:表明这是一个数组 new int[10]:给前面的数组类型的number变量分配10个int类型的空间大小
- Java 数组的三种创建方法,数组拷贝方法
public static void main(String[] args) {//创建数组的第一种方法int[] arr=new int[6];int intValue=arr[5];//Syste ...
- Java反射04 : 通过Array动态创建和访问Java数组
java.lang.reflect.Array类提供了通过静态方法来动态创建和访问Java数组的操作. 本文转载自:https://blog.csdn.net/hanchao5272/article/ ...
- Java中数组的创建
Java中数组的使用 1.普通数组变量的定义: //数组 //1.数组是Java中很重要的一部分,今天对数组进行了大致的了解,Java中的数组和C中数组还是有一定的区别的 //以下是总结的几种方法 p ...
随机推荐
- ICPC2019徐州站游记
day0 出师不利 差两分钟没赶上高铁回去我一定每天都到下边玩跑步 改签成卧铺,原来3点发7点到现在11点发9点到 本来计划火车上3个人练习一场,晚上宾馆还可以cf 结果全泡汤了,在火车站浪了一晚上 ...
- 利用swoole coroutine协程实现redis异步操作
<?php #注意:如果不开启兼容模式,会遇到这样的现象,用swoole协程的方法访问常规方法添加到redis中的数据,可能访问不到(直接返回NULL)!这可能是两者采用了不同的技术标准所致! ...
- Bootstrap-轮播图-No.3
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 步骤五 · 4-9 解决getElementsByClassName()兼容性 未解决
前端零基础入门 2019版 / 步骤五 · 4-9 解决getElementsByClassName()兼容性
- ros中同时订阅两个topic(2张图像)合并成一个topic(1张图像)
2019-12-06 15:42:39 先暂时做个资料保存 要同时用两个红外相机,但是没有做硬件上的 时间戳同步,就是笔记本上同时插着两个相机. 两个topic发布各自相机的图像,然后要有个节点同时订 ...
- Zabbix 数据库迁移
背景:ZABBIX的环境是LNMP,MySQL的架构是M-M主备模式,单台服务器SSD硬盘800G.监控主机日渐增多,空间不足,迁移到同样架构下的SAS盘2T空间. 架构:A 192.168.0.10 ...
- msbuild不是内部或外部命令
首先这个问题纠结了很久,在网上找了查阅了很多博客,大多在介绍介绍批处理为何物,但是就是没有明确的解决方案. 如果想具体了解msbuild是何物,自己查找资料把. 好吧,下面介绍下正确的解决方案. 很简 ...
- 掌握 3 个搜索技巧,在 GitHub 上快速找到实用软件资源
GitHub 作为目前广大程序猿最大的游乐场,在今年 6 月被 微软 以 75 亿美元价值的微软股票收购,GitHub 再次成为业界讨论的焦点.GitHub 以自由开放的定位吸引了相当多的个人开发者和 ...
- Http协议三次握手和四次挥手
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示: SYN(synchronous建立联机) ACK(acknowledgemen ...
- 手把手教你在Linux系统下安装MySQL
在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. 下载并安装MySQL官方的 Yum R ...