Java | Data Science | IT | Programming |
---|
collection
03.30
集合接口:
-
E next();
boolean hasNext();
void remove();
-
for each 循环编译为带有迭代器的循环。
for(E element : collection)
任何实现了Iterable接口的对象可以使用该循环Collection
接口扩展了Iterable
接口。
Iterable
接口只有一个方法:Iterator<E> iterator();
boolean add()
方法 添加改变了集合返回true.例如集(set)中不能有重复元素
Iterator<E> iterator();
方法 返回迭代器对象,可遍历集合。interface Iterator的三个方法:
迭代器
Java迭代器的特征 查找操作与位置变更紧密相连,执行查找操作同时迭代器位置向前移动。
将Java迭代器认为位于两个元素之间,调用next()
时,迭代器就越过下一个元素,并返回刚刚越过元素的引用。
InputStream.read()
等效的
C++SLT 迭代器依数组下标建模
泛型实用方法
Collection接口提供了很多实用方法,为了更容易的实现这个接口,Java类库提供了抽象类AbstractCollection,将基础方法size和iterator 抽象化,但提供了例行方法如contains。Collection接口的大部分方法在这个抽象类中实现。
具体的集合类可以扩展该抽象类,声明自己的方法,不必再提供contains等方法。
generic //todo
接口和抽象类有什么区别
具体的集合
LinkedList
数组添加删除操作移动元素,链表解决了这个问题。链表中删除,添加需修改元素附近的结点。Java类库提供LinkedList类,解决指针问题。
LinkedList类与泛型集合的不同,LinkedList有序。LinkList.add(…)方法将添加到链表尾部(may be extended from Collection),有时需要依赖位置的add方法
迭代器描述集合中的位置。next() previous()方法改变迭代器的位置 并返回刚刚越过的元素
add方法依赖位置 ∴将由迭代器负责add(E e)方法 有序的集合add方法才有意义 Iterator接口中没有add方法,子接口ListIterator才有add方法
多次调用add,元素依次添加到迭代器当前位置之前。如何多次添加在表头、表尾、表中的情况下
添加元素之后,迭代器仍指示当前位置之前//todo
迭代器并发修改集合产生异常
链表迭代器等检测迭代器或自身方法对集合的修改。可令附加的迭代器维护自己的计数值,调用迭代器方法时比较该值与集合跟踪的次数是否一致。
- //todo
只能检测结构化修改。所有迭代器都可调用set而不产生异常。
method Iterator.get() is less efficient. try not to use it. Avoid using methods like this which index in the
HashSet
散列表是一种无序集中可以快速的查找所需要的对象的数据结构。
散列表为每个对象计算一个整数,散列码hash code,由对象的实例域产生。
哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 建立哈希表的步骤
- 使用哈希函数将被查找的键转换为数组的索引.不同的值域类型,可通过不同的映射方式(哈希函数)将键映射成索引。如整数集 mod m.数组用保留除余法,将数组的字符保留当成一个大的整数再哈希。通常需要实现自己 的哈希函数
- 在理想的情况下,不同的键会被转换为不同的索引值,但是在有些情况下我们需要处理多个键被哈希到同一个索引值的情况。所以哈希查找的第二个步骤就是处理冲突.
方法:Separate chaining with linked lists
拉链法如图
Java中散列表用链表数组实现。每个列表称为bucket,用来存放散列码相同的元素。
查找元素时用散列码对桶数取模得到的数再查找对应数组索引的列表。
初始桶数可估计为预计元素个数的75%,且设置为素数,stl设置为2的幂。不能预估个数需设置装填因子在需要时再散列。
散列表可用于实现几个重要的数据结构 如集。
散列集迭代器将依次访问所有的桶
TreeSet
it’s a sorted collection
可以以任意顺序插入元素,TreeSet可自动对元素排序。当前为red-black tree.
red-black tree
对象的比较
comparable接口 int compareTo(T t)
对于一个类只能实现这个接口依次。如果几个集合要按对象的不同信息排序该怎么办呢
SortedSet<Item> sortByxxx = new TreeSet<Item> (new Comparator<>(){public int compare(Item a, Item b){...}})
函数对象、动态定义
队列
优先级队列
映射表
要查看一个元素 需要有元素的精确副本,这不是一种非常通用的查找方式。通常,我们利用存放键-值对的的数据结构-映射表,提供了键的信息就可以查找到元素的值。
Java类库 HashMap TreeMap 与集一样。