软构实验二中,用到了不少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)