Collection生成器CollectionData

CollectionData体现了适配器模式的设计思想,它能把实现Generator接口的类的对象(包括上一章数组中的各种RandomGenerator)都复制到自身当中。

 import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set; interface Generator<T> {
T next();
} 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 Animal implements Generator<String> {
private String[] items = { "Dog", "Pig", "Cat" };
private int index;
@Override
public String next() {
return items[index++];
}
} public class Test2 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>(new CollectionData<String>(new Animal(), 3));
System.out.println(set); // [Dog, Pig, Cat]
set.addAll(CollectionData.list(new Animal(), 3));
System.out.println(set); // [Dog, Pig, Cat]
}
}

Map生成器MapData

我们可以使用同样的方式生成Map,我们可以Generator<K>,Generator<V>分开生成,也可以使用Pair<K, V>组装好K,V再生成。

 import java.util.Iterator;

 import java.util.LinkedHashMap;

 class Pair<K, V> {
public final K key;
public final V value; public Pair(K k, V v) {
this.key = k;
this.value = v;
}
} class MapData<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = 1L; // A single Pair Generator:
public MapData(Generator<Pair<K, V>> gen, int quantity) {
for (int i = 0; i < quantity; i++) {
Pair<K, V> p = gen.next();
put(p.key, p.value);
}
} public static <K, V> MapData<K, V> map(Generator<Pair<K, V>> gen, int quantity) {
return new MapData<K, V>(gen, quantity);
} // Two separate Generators:
public MapData(Generator<K> genK, Generator<V> genV, int quantity) {
for (int i = 0; i < quantity; i++) {
put(genK.next(), genV.next());
}
} public static <K, V> MapData<K, V> map(Generator<K> genK, Generator<V> genV, int quantity) {
return new MapData<K, V>(genK, genV, quantity);
} // A key Generator and a single value:
public MapData(Generator<K> genK, V value, int quantity) {
for (int i = 0; i < quantity; i++) {
put(genK.next(), value);
}
} public static <K, V> MapData<K, V> map(Generator<K> genK, V value, int quantity) {
return new MapData<K, V>(genK, value, quantity);
} // An Iterable and a single value:
public MapData(Iterable<K> genK, V value) {
for (K key : genK) {
put(key, value);
}
} public static <K, V> MapData<K, V> map(Iterable<K> genK, V value) {
return new MapData<K, V>(genK, value);
}
} class Letters implements Generator<Pair<Integer, String>>, Iterable<Integer> {
private int size = 9;
private int number = 1;
private char letter = 'A'; @Override
public Pair<Integer, String> next() {
return new Pair<Integer, String>(number++, "" + letter++);
} @Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
@Override
public Integer next() {
return number++;
} @Override
public boolean hasNext() {
return number < size;
} @Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
} public class Test3 {
public static void main(String[] args) {
// A single Pair Generator test
MapData<Integer, String> data1 = MapData.map(new Letters(), 11);
System.out.println(data1); // {1=A, 2=B, 3=C, 4=D, 5=E, 6=F, 7=G, 8=H, 9=I, 10=J, 11=K}
// An Iterable and a single value test
MapData<Integer, String> data2 = MapData.map(new Letters(), "Pop");
System.out.println(data2); // {1=Pop, 2=Pop, 3=Pop, 4=Pop, 5=Pop, 6=Pop, 7=Pop, 8=Pop}
}
}

Java集合(2):两个生成器的例子:Collection生成器CollectionData及Map生成器MapData的更多相关文章

  1. Java 集合深入理解(3):Collection

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象: 集合可以对 ...

  2. Java集合体系结构(List、Set、Collection、Map的区别和联系)

    Java集合体系结构(List.Set.Collection.Map的区别和联系) 1.Collection 接口存储一组不唯一,无序的对象 2.List 接口存储一组不唯一,有序(插入顺序)的对象 ...

  3. 我所理解Java集合框架的部分的使用(Collection和Map)

    所谓集合,就是和数组类似——一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接 ...

  4. Java集合源码学习(一)Collection概览

    1.集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Coll ...

  5. Java 多线程编程两个简单的例子

    /** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...

  6. 6.Java集合总结系列:常见集合类的使用(List/Set/Map)

    MARK 总结: Set.List 和 Map 可以看做集合的三大类. List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问. Set集合是无序集合,集合中的元素不可 ...

  7. Java集合(0):概述

    下面是一个Java集合的简化图,我们可以看出,集合分Collection和Map两大部分: 接下来分别以下面几个章节介绍Java集合: Java集合(1):Collections工具类中的static ...

  8. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  9. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

随机推荐

  1. tsung压力测试环境部署详细步骤(内附安装包)

    操作系统: Redhat 6.3.Redhat6.5 .centos7.4(这些版本已验证过) tsung版本: tsung-1.6.0 下载地址: 链接: https://pan.baidu.com ...

  2. filebeat configure

    docker run -d --rm -v ./filebeat.yml:/usr/share/filebeat/filebeat.yml -v /var/log:/var/log  docker.e ...

  3. C# Tcp和Socket 网络(五)

    TcpReceive public Form1() { InitializeComponent(); new Thread(() => { IPAddress ip = IPAddress.Pa ...

  4. 【ArcMap】

    1.加载图层(1)内容列表中右键添加数据(2)目录列表中拖拽(3)导航中的添加数据 2.编辑要素(1)选中编辑器点击开始编辑(2)在编辑要素中选中要编辑的要素 选择构造工具 执行编辑操作(3)停止编辑 ...

  5. .net core Areas区域

    //使用MVC app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:ex ...

  6. removeClass([class|fn])

    removeClass([class|fn]) 概述 从所有匹配的元素中删除全部或者指定的类.直线电机生产厂家   参数 classStringV1.0 一个或多个要删除的CSS类名,请用空格分开 f ...

  7. react-native-page-scrollview 的使用方法(实现酷炫的分页轮播效果,还支持自定义View)

    react-native-page-scrollview 对ScrollView的封装,可以很方便的实现水平,垂直分页轮播效果.而且可以自定义分页宽高,和侧边View的旋转,透明度,大小等. 对于原生 ...

  8. IntelliJ IDEA 创建 Git 分支并且 Push 到远程

    在 IntelliJ 的右下角,你可以看到当前的 Git 分支,然后你可以单击这个分支后,在弹出的界面的最上方有一个新建分支的选项. 然后再弹出的界面中,输入你要创建的分支名称后回车输入. 然后从项目 ...

  9. DP-------bzoj2699 更新

    题目描述: 对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值.假设所有数都在范围 ...

  10. Meathill的博客地址

    https://blog.meathill.com/ 安装mysql: https://blog.meathill.com/tech/setup-windows-subsystem-linux-for ...