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. 牛客练习赛42 C 出题的诀窍 (贡献,卡常)

    牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...

  2. Codeforces 1175F The Number of Subpermutations

    做法①:RMQ(预处理NLOGN+后续跳跃蜜汁复杂度) 满足题意的区间的条件转换: 1.长度为R-L+1则最大值也为R-L+1 2.区间内的数不重复 当RMQ(L,R)!=R-L+1时 因为已经保证了 ...

  3. linux中部署django项目

    通过Nginx部署Django(基于ubuntu) Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器 ...

  4. libusb_bulk_transfer 异步同步

    同步方式 libusb_bulk_transfer(devh, ep_bulk, buf, CAM_BUF_SZ, &len, timeout); 进入libusb研究,发现libusb是采用 ...

  5. python+Appium自动化:TouchAction九宫格实战

    TouchAction Touch Action包含一系列操作,比如按压.长按.点击.移动.暂停. 使用TochAction需要先导入对应的模块 from appium.webdriver.commo ...

  6. 《SVG精髓》笔记(一)

    本文是基于<SVG精髓>一书的简单总结,文中的demo均为该书提供,目的是方便大家使用时快速查阅. 1. 坐标系统 视口(viewport):文档使用的画布区域,表示SVG可见区域的大小, ...

  7. Serializable(转)

    最近在阅读JDK源码中的集合,看到很多集合类实现了Serializable接口,Cloneable接口.在阅读了很多关于Serializable接口的博客后,浅谈下我对Serializable接口的理 ...

  8. docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」

    很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...

  9. ZOJ - 4114 Flipping Game

    ZOJ - 4114 Flipping Game 题目大意:给出两个串s,t,n个灯泡的序列,1代表开着,0代表关着,一共操作k轮,每轮改变m个灯泡的状态,问最终能把s串变成t串的方案数. 坤神题解. ...

  10. LoadLibrary(C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll) error: 找不到指定的模块。 C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll: can't load file LoadLibrary(C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll) erro

    LoadLibrary(C:\soft\IDA 7.0\IDA 7.0\plugins\python64.dll) error: 找不到指定的模块. C:\soft\IDA 7.0\IDA 7.0\p ...