Java集合(2):两个生成器的例子:Collection生成器CollectionData及Map生成器MapData
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的更多相关文章
- Java 集合深入理解(3):Collection
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点粉,来学学 Collection 吧! 什么是集合? 集合,或者叫容器,是一个包含多个元素的对象: 集合可以对 ...
- Java集合体系结构(List、Set、Collection、Map的区别和联系)
Java集合体系结构(List.Set.Collection.Map的区别和联系) 1.Collection 接口存储一组不唯一,无序的对象 2.List 接口存储一组不唯一,有序(插入顺序)的对象 ...
- 我所理解Java集合框架的部分的使用(Collection和Map)
所谓集合,就是和数组类似——一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接 ...
- Java集合源码学习(一)Collection概览
1.集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Coll ...
- Java 多线程编程两个简单的例子
/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...
- 6.Java集合总结系列:常见集合类的使用(List/Set/Map)
MARK 总结: Set.List 和 Map 可以看做集合的三大类. List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问. Set集合是无序集合,集合中的元素不可 ...
- Java集合(0):概述
下面是一个Java集合的简化图,我们可以看出,集合分Collection和Map两大部分: 接下来分别以下面几个章节介绍Java集合: Java集合(1):Collections工具类中的static ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- 浅入深出之Java集合框架(下)
Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...
随机推荐
- vue.js 父子组件间 props 数据同步处理
常见的场景: 在一个vue组件A中,使用另外一个组件B.A将自己的数据通过B组件的Props属性(propX)传递到B组件实例内部,B组件内部会修改该Props属性(propX)的值,此时在A组件内部 ...
- [zhuanzai]Bean对象注入失败 .NoSuchBeanDefinitionException: No qualifying bean of type..
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying b ...
- Cobbler安装和配置
1.yum国内源的安装与更新 1.1 备份原repo文件 cd /etc/yum.repo.d/ mkdir repo_bak mv *.repo repo_bak 1.2 在centos中配置网易和 ...
- 基于STM32调试工具STM-STUDIO-STM32的使用
手上有stlink下载器,正好看到官网有这个工具,可以在运行中实时查看变量的数据.这一点和ucos的ucprobe很类似. 参考https://mp.weixin.qq.com/s?src=11&am ...
- 浅谈script中的defer与async
一直没有在script上使用过别的属性,今天看基础代码才发现这个,搜索.记录下,以便记忆. 大家都知道,js加载会造成阻塞,阻碍页面的继续渲染. defer: js与页面同步加载,不阻碍页面渲染,会在 ...
- 2018-2019 ICPC, NEERC J. Streets and Avenues in Berhattan(DP)
题目链接:https://codeforc.es/contest/1070/problem/J 题意:给出一个长度为 k 的字符串,选出 n 个和 m 个不同位置的字符构成两个字符串,使得两个字符串相 ...
- HDU 6059 - Kanade's trio | 2017 Multi-University Training Contest 3
思路来自题解(看着题解和标程瞎吉尔比划了半天) /* HDU 6059 - Kanade's trio [ 字典树 ] | 2017 Multi-University Training Conte ...
- RDLC 传参 报表出现错误 (未解决)
经过测试 可以用的 带传参的 RDLC 在vs2019上 能正常运行 但在vs2019上剪切后,保存, 运行就会报An error 错误, ctr+z 全部 撤销后 保存 一样会报 这 ...
- mybatis标签selectkey无法返回主键值
- mac使用jadx逆向app
安装jadx 编译安装 git clone https://github.com/skylot/jadx.git cd jadx ./gradlew dist 然后将build/jadx/bin加入到 ...