一、集合
1、 集合的应用
- 集合可以用来去重
- 集合可以用于进行客户的统计
- 集合可以用于文本词汇量的统计
2、集合的实现
(1)对于集合的一些定义,我们一般也都了解,例如集合一般都不会存放重复的元素,因此这就让它有了去重的功用了。
public interface Set<E> {
void add(E e);//不能添加重复元素
boolean contains(E e);
void remove(E e);
int getSize();
boolean isEmpty();
}
(2)集合基于BST的实现
package com.zfy.setandmap;
import com.zfy.bst.BST;
/*
* 这里是基于之前的二分搜索树实现的,
* 1.因为集合具有去重的功用,说明它是可以有比较的功能的,所以这里实现了Comparable类,
* 2.因为集合是可以存各种的数据类型,因此这里设计为泛型
* */
public class BSTSet<E extends Comparable<E>> implements Set<E> {
private BST<E> bst;
//所有的BSTSet都是基于BST的
public BSTSet() {
bst = new BST<>();
}
@Override
public void add(E e) {
bst.add(e);
}
@Override
public boolean contains(E e) {
return bst.contains(e);
}
@Override
public void remove(E e) {
bst.remove(e);
}
@Override
public int getSize() {
return bst.getSize();
}
@Override
public boolean isEmpty() {
return bst.isEmpty();
}
}
(3)用链表作为集合的底层实现
public class LinkedListSet<E> implements Set<E> {
private LinkedList<E> list;
// 构造函数
public LinkedListSet() {
list = new LinkedList<>();
}
// 实现getSize方法
@Override
public int getSize() {
return list.getSize();
}
// 实现isEmpty方法
@Override
public boolean isEmpty() {
return list.isEmpty();
}
// 实现contains方法
@Override
public boolean contains(E e) {
return list.contains(e);
}
// 实现add方法
@Override
public void add(E e) {
if (!list.contains(e)) {
list.addFirst(e);
}
}
// 实现remove方法
@Override
public void remove(E e) {
list.removeElement(e);
}
(4)用二分搜索树实现的集合与用链表实现的集合的性能比较
import java.util.ArrayList;
public class Main {
public static double testSet(Set<String> set, String filename) {
long startTime = System.nanoTime();
System.out.println(filename);
ArrayList<String> words = new ArrayList<>();
if (FileOperation.readFile(filename, words)) {
System.out.println("Total words: " + words.size());
for (String word : words) {
set.add(word);
}
System.out.println("Total different words: " + set.getSize());
}
long endTime = System.nanoTime();
return (endTime - startTime) / 1000000000.0;
}
public static void main(String[] args) {
String