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 ...
 
随机推荐
- C#的队列(Queue,ConcurrentQueue)和堆栈(Stack,ConcurrentStack)
			
一.Queue 表示对象的先进先出(FIFO)集合,非线程安全 常用方法 Dequeue 入队 Enqueue 出队 Contains 队列中是否存在某元素 Clear 清空队列 封装: /// ...
 - eclipse找不到JadClipse问题
			
版本信息: Eclipse Java EE IDE for Web Developers. Version: 2018-09 (4.9.0) 根据以往配置,放在eclipse\plugins下不生效, ...
 - nginx 之 root和alias
			
转载: https://www.jianshu.com/p/4be0d5882ec5 https://blog.csdn.net/Erica_1230/article/details/7855311 ...
 - CI环境搭建-创建git
			
添加如下配置: 上图说的需每次启动的即下面这个文件: 默认用户名.密码是admin/admin 创建代码仓库: 选择版本库: 使用方法: 1,创建一个文件夹 选择版本库地址: 也可以通过c ...
 - LA 6979  Known Notation   构造+贪心  铜牌题
			
题意:给出一个字符串,有两种操作: 1.插入一个数字 2.交换两个字符 问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*) #include <cstdio> #inclu ...
 - python 绘制f(x)=x^2
			
code import turtle import math turtle.speed() # 画一个平方的函数 turtle.penup() turtle., *) turtle.pendown() ...
 - Flask-websocket实现聊天功能
			
群聊无昵称 原生js代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
 - [笔记]C++拷贝构造和移动构造
			
一.拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都没有默认值,则此构造函数是拷贝构造函数.(<C++Primer,第五版>) class Foo { publi ...
 - CF883H
			
CF883H 题意: 给你一个字符串,需要把它以最小的划分次数划分为x个长度相等的回文串,可以重新排列. 解法: 大模拟一个. 分别统计出现一次的字符和出现两次的字符,如果没有出现一次的字符,那么所有 ...
 - 6.使用Feign实现声明式REST调用
			
使用Feign实现声明式REST调用 6.1. Feign简介 Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单. Feign提供了H ...