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 ...
随机推荐
- Codeforces 920E-Connected Components? (set,补图,连通块)
Connected Components? CodeForces - 920E You are given an undirected graph consisting of n vertices a ...
- JavaScript实现数据的双向绑定
接触到Angulr.js和Vue.js后,提到最多的就是双向绑定 下面将用JavaScript实现数据的双向绑定 <!DOCTYPE html> <html> <head ...
- 记录一下UILabel加载富文本 iOS
一般情况下我们都习惯用webview加载富文本.但是webview比较消耗内存.然后发现其实本身可以用uilabel加载,性能还不错就记录下~~ 核心方法下面两个 -(NSMutableAttribu ...
- linux批量添加用户和批量修改密码
一.批量创建用户通过命令newusers可以实现批量的创建用户.这个命令的用法为 newusers file.txt(一个文本文件)文本文件内存放需要批量添加的用户信息但是对格式有要求格式:pw_na ...
- CF487E Tourists[圆方树+树剖(线段树套set)]
做这题的时候有点怂..基本已经想到正解了..结果感觉做法有点假,还是看了正解题解.. 首先提到简单路径上经过的点,就想到了一个关于点双的结论:两点间简单路径上所有可能经过的点的并等于路径上所有点所在点 ...
- 部署lnmp
装包 1.安装依赖包 yum - y install gcc openssl-devel pcre-devel zlib-devel 2.解源码包 .tar.gz 3.切换到解压缩后的目录,配置参数 ...
- UTF-8 无 BOM
[参考] UTF8最好不要带BOM,附许多经典评论 Visual Studio UTF-8 无 BOM 一站式解决办法https://blog.csdn.net/dolphin98629/articl ...
- 我关了solution并且删掉个sln.DotSettings.user后似乎也可以了
"Go To Definition" is disabled in Visual Studio http://social.msdn.microsoft.com/Forums/en ...
- Win2008 R2 IIS FTP防火墙的配置
注意以下两个选项要在防火墙下开启,否则将会访问失败.
- js面向对象学习笔记
1.函数的定义方式 第一种定义方式 function fn1() { alert("fn1"); } alert(fn) 函数就是一个特殊的对象,是一个Function类的实例,其 ...