软件构造——集合的相关知识

软构实验二中,用到了不少Set以及Map相关的类,对于初次接触的人来说,可能会一头雾水,不知所措。今天我就来简单介绍一下Java中集合相关的内容。

Java 最初版本只为最常用的数据结构提供了很少的一组类: Vectοr 、Stack 、Hashtable 、
BitSet 与Enumeration 接口,其中的Enumeration 接口提供了一种用于访问任意容器中各个元
素的抽象机制。这是一种很明智的选择,但要想建立一个全面的集合类库还需要大量的时间
和高超的技能。

在Java 类库中,集合类的基本接口是Collection 接口。这个接口有两个基本方法:

public interface Collection<E>
{
    boolean add(E element);
    Iterator<E> iterator();
    ...
}

即添加方法以及迭代器方法。

add 方法用于向集合中添加元素。如果添加元素确实改变了集合就返回true ,如果集合
没有发生变化就返回false 。例如,如果试图向集中添加一个对象,而这个对象在集中已经存
在,这个添加请求就没有实效,因为集中不允许有重复的对象。
iterator 方法用于返回一个实现了Iterator 接口的对象。可以使用这个迭代器对象依次访
问集合中的元素。

Java 集合框架为不同类型的集合定义了大量接口:

集合有两个基本接口:Collection 和 Map

可以用add方法加入元素,但对于映射(Map)而言,需要包含键和值的对,因此采用put方法来插入:

V put(K key, V value)

List 是一个有序集合 。元素会增加到容器中的特定位置。可以采用两种方式访问元素:使用迭代器访问,或者使用一个整数索引来访问。后一种方法称为随机访问 ,因为这样可以按任意顺序访问元素。与之不同,使用迭代器访问时,必须顺序地访问元素。

List 接口定义了多个用于随机访问的方法:

void add(int index, E element)
void remove(int index)
E get(int index)
E set(int index, E element)

下表展示了具体的集合类型及其功能:

集合类型描述
ArrayList一种可以动态增长和缩减的索引序列
LinkedList一种可以在任何位置进行高效地插入和删除操作的有序序列
ArrayDeque一种用循环数组实现的双端队列
HashSet一种没有重复元素的无序集合
TreeSet一种有序集

EnumSet

一种包含枚举类型值的集
LinkedHashSet一种可以记住元素插入次序的集
PriorityQueue一种允许高效删除最小元素的集合
HashMap一种存储键/值关联的数据结构
TreeMap一种键值有序排列的映射表
EnumMap一种键值属于枚举类型的映射表
LinkedHashMap一种可以记住键/值项添加次序的映射表
WeakHashMap一种其值无用武之地后可以被垃圾回收器回收的映射表
IdentityHashMap一种用== 而不是用equals 比较键值的映射表

其各种函数功能可以在Java文档中查询。

实验用例:

在实验二的P1中,GraphPoet类需要计算图中两个点之间包含一个点的最长路径,我们需要通过集合的相关功能,求出起点的终点集和终点的起点集的交集,就用到了retainAll函数:它将一个集合中同另一个集合中相同的内容保留,删除不同内容,这样就得到了交集。

public String poem(String input) {
    	String[] words = input.split(" ");
    	String result = words[0];
    	for(int i = 0; i < words.length - 1; i++) {
		Map<String, Integer> targets = graph.targets(words[i].toLowerCase());
		Map<String, Integer> sources = graph.sources(words[i + 1].toLowerCase());
		Set<String> insert = targets.keySet();
		insert.retainAll(sources.keySet());
		int maxBridge = Integer.MIN_VALUE;
		String bridge = "";
		for(String key : insert) {
			if(sources.get(key) + targets.get(key) > maxBridge) {
				maxBridge = sources.get(key) + targets.get(key);
				bridge = key;
			}
		}
		if(bridge != "")
			result = result + " " + bridge + " " + words[i + 1];
		else
			result = result + " " + words[i + 1];
	}
    	return result;
        //throw new RuntimeException("not implemented");
    }

以上为本篇文章的全部内容。

参考文献:

【1】Cay S. Horstman - Core Java Volume I-Fundamentals(10th Edition) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值