Apache容器扩展类和常用方法

1. 新单词:

  • symmetric 对称的 
  • exclusive 独有的 
  • disjunction 分离 
  • cardinality 基数
  • equivalent 相等的

2. 闭包Closure 

  业务操作:重写execute()方法

  工具类:CollectionUtils.forAllDo()关联操作

  1) IfClosure.ifClosure(断言, 业务, 业务) 二选一操作

  2) ChainedClosure.chainedClosure(业务, 业务) 链式操作

  3) WhileClosure.whileClosure(断言, 业务, boolean(false是先进行判断再进行操作,true是先进行操作再进行判断)) 循环操作

3. 交集、差集、并集

1)交集:CollectionUtils.intersection()
 
          CollectionUtils.retainAll() 
2)差集:CollectionUtils.subtract()
3)并集:CollectionUtils.union() 
4)不同元素: CollectionUtils.disjunction()

public static void main(String[] args) {

		Set<Integer> set1 = new HashSet<Integer>();
		set1.add(1);
		set1.add(2);
		set1.add(3);

		Set<Integer> set2 = new HashSet<Integer>();
		set2.add(2);
		set2.add(3);
		set2.add(4);

		// 求交集
		// Collection<Integer> inter = CollectionUtils.intersection(set1, set2);
		Collection<Integer> inter = CollectionUtils.retainAll(set1, set2);
		System.out.println("交集:" + inter);

		// 求差集
		Collection<Integer> diff = CollectionUtils.subtract(set1, set2);
		System.out.println("差集:" + diff);

		// 求并集
		Collection<Integer> union = CollectionUtils.union(set1, set2);
		System.out.println("交集:" + union);

		// 求出不同的元素
		Collection<Integer> dist = CollectionUtils.disjunction(set1, set2);
		System.out.println("不同元素:" + dist);
	}
}
	/*
	Output:
		交集:[2, 3]
		差集:[1]
		交集:[1, 2, 3, 4]
		不同元素:[1, 4]
	*/

4. 队列的扩展:

1)循环队列:CircularFifoQueue 

2)只读队列: UnmodifiableQueue.unmodifiableQueue()

3)断言队列:PredicatedQueue.predicatedQueue()

public static void main(String[] args) {
		// circularQueue();
		// readOnlyQueue();
		// predicateQueue();
	}

	// 循环队列
	public static void circularQueue() {
		CircularFifoQueue<String> circular = new CircularFifoQueue<String>(2);// 长度为2
		circular.add("a");
		circular.add("b");
		circular.add("c");
		System.out.println(circular);
		// Output: [b, c]
	}

	// 只读队列
	public static void readOnlyQueue() {
		CircularFifoQueue<String> circular = new CircularFifoQueue<String>();// 默认长度为32
		circular.add("a");
		circular.add("b");
		circular.add("c");
		// 变为只读队列
		Queue<String> que = UnmodifiableQueue.unmodifiableQueue(circular);
		// que.add("d"); 报错
	}

	// 断言队列
	public static void predicateQueue() {
		CircularFifoQueue<String> circular = new CircularFifoQueue<String>();// 默认长度为32
		Predicate<String> notNull = NotNullPredicate.notNullPredicate();
		// 设置为断言队列
		Queue<String> que = PredicatedQueue.predicatedQueue(circular, notNull);
		que.add("a");
		que.add("b");
		// que.add(null) 报错
	}

5. 迭代器的扩展:

1)JDK中Map的两种遍历方法keySet()和entrySet()

2)Apache中的迭代器MapIterator和mapiterator()方法

  但是这个迭代器要Apache中使用

  IterableMap的HashedMap(简单来说IterableMap相当于Map;HashedMap相当于HashMap)

3)去重迭代器,相当于过滤器:UniqueFilterIterator

4)自定义迭代器:FilterIterator + Predicate 断言

5)循环迭代器:LoopingIterator(注意一下参数和访问)

public static void main(String[] args) {
		// testMap();
		// mapIt();
		// uniqueIt();
		// selfIt();
		loopingIt();
	}

	// JDK中Map的两种遍历方式
	public static void testMap() {
		Map<String, String> map = new HashMap<String, String>();
		map.put("a", "first");
		map.put("b", "second");
		map.put("c", "third");
		// 第一种 keySet()
		Set<String> keys = map.keySet();
		Iterator<String> iter = keys.iterator();
		while (iter.hasNext()) {
			String key = iter.next();
			String value = map.get(key);
			System.out.println(key + "-->" + value);
		}

		System.out.println("===================");

		// 第二种 entrySet()
		Set<Entry<String, String>> entry = map.entrySet();
		Iterator<Entry<String, String>> iter2 = entry.iterator();
		while (iter2.hasNext()) {
			Entry<String, String> tempMap = iter2.next();
			String key = tempMap.getKey();
			String value = tempMap.getValue();
			System.out.println(key + "-->" + value);
		}

	}

	// Apache中的迭代器
	public static void mapIt() {
		IterableMap<String, String> map = new HashedMap<String, String>();
		map.put("a", "first");
		map.put("b", "second");
		map.put("c", "third");
		// 迭代器
		MapIterator<String, String> iter = map.mapIterator();
		while (iter.hasNext()) {
			String key = iter.next();
			String value = map.get(key);
			System.out.println(key + "-->" + value);
		}
	}

	// 去重迭代器
	public static void uniqueIt() {
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("a");
		// 去重迭代器
		Iterator<String> iter = new UniqueFilterIterator(list.iterator());
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
	}// Output:a b

	// 自定义迭代器
	public static void selfIt() {
		List<String> list = new ArrayList<String>();
		list.add("refer");
		list.add("fsdd");
		list.add("mom");
		// 断言 :寻找回文
		Predicate<String> pre = new Predicate<String>() {
			@Override
			public boolean evaluate(String input) {

				return new StringBuilder(input).reverse().toString()
						.equals(input);
			}
		};

		// 关联
		Iterator<String> iter = new FilterIterator(list.iterator(), pre);
		while (iter.hasNext()) {
			System.out.println(iter.next());
		}
	}

	// 循环迭代器
	public static void loopingIt() {
		List<String> list = new ArrayList<String>();
		list.add("refer");
		list.add("fsdd");
		list.add("mom");
		Iterator<String> iter = new LoopingIterator(list);// 不再是list.iterator()
		for (int i = 0; i < 5; i++) {// 不再是iter.hasNext()
			System.out.println(iter.next());
		}
	}// Output:refer fdss mom refer fdss

6. 双向(key和value都是唯一的)Map--> BidiMap
 1) inverseBidiMap()反转
 2)实现类:DualHashMap 无序

             DualTreeMap 有序

public static void main(String[] args) {
		
		BidiMap<String, String> map = new DualTreeBidiMap<String, String>();
		map.put("新浪", "www.sina.com");
		map.put("百度", "www.baidu.com");
		map.put("途牛", "www.tuniu.com");


		// 通过value找key值
		String str = map.inverseBidiMap().get("www.baidu.com");
		System.out.println(str);
		// 遍历
		MapIterator<String, String> iter = map.mapIterator();
		while(iter.hasNext()) {
			String key = iter.next();
		  //String key = iter.getKey();可以这样,但必须有iter.next()
			String value = iter.getValue();
			System.out.println(key+"-->"+value);
		}
	}
	/*
	Output:
		百度
		新浪-->www.sina.com
		百度-->www.baidu.com
		途牛-->www.tuniu.com
		这里貌似不是有顺序的输出?
		解释:Unicode(新)<Unicode(百)<Unicode(途),因此是有顺序的
	*/

7.  包——Bag 允许重复(可以用来统计单词的个数)
   实现类:
  HashBag   无序
  TreeBag       有序

public static void main(String[] args) {
	  //testBag();
		wordsCount();
		
	}
	
	// Bag的基本用法
	public static void testBag() {
		Bag<String> bag = new TreeBag<String>();
		bag.add("a");
		bag.add("b", 4);// 加入4个"b"
		bag.remove("b", 3);// 删除3个"b"
		Iterator<String> iter = bag.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}// Output:a b
	}
	
	// 统计单词个数
	public static void wordsCount() {
		Bag<String> bag = new TreeBag<String>();
		String str = "today is mine moneny is mine";
		String[] strArray = str.split(" ");
		// 分拣存储
		for(int i = 0; i < strArray.length; i++) {
			bag.add(strArray[i]);
		}
		// 遍历
		Set<String> keys = bag.uniqueSet();// 这里用Set是因为Set中存储的值不能相同
		Iterator<String> iter = keys.iterator();
		while(iter.hasNext()) {
			String key = iter.next();
			System.out.println(key+"-->"+bag.getCount(key));
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值