(1)定义Set接口
/*
* 集合:存储不重复元素的容器
有序集合中的元素具有顺序性,基于搜索树实现
无序集合中的元素没有顺序性,基于哈希表实现
顺序性,是指按照元素的大小进行排序,并非指插入的顺序
有序性,是指元素的进场顺序和出场顺序一致
应用场合:
客户统计
词汇量统计
*/
public interface Set<E> {
public void add(E e); //添加指定元素
public void remove(E e);//移除指定元素
public boolean contains(E e);//查看指定元素是否包含
public int getSize();
public boolean isEmpty();//判断集合是否为空
}
(2) LinkList实现的Set集合
import p02.动态链表.SingleLinkList;
public class LinkedSet<E> implements Set<E>{
private SingleLinkList<E> list;
public LinkedSet() {
list=new SingleLinkList<>();
}
@Override
public void add(E e) { //O(n)
/*
* 首先判断添加的元素是否原来就存在,如果不存在,就添加。
*/
if(!list.contains(e)){
list.addLast(e);//O(1)
}
}
@Override
public void remove(E e) {//O(n)
list.removeElement(e);
}
@Override
public boolean contains(E e) {//O(n)
return list.contains(e);
}
@Override
public int getSize() {
return list.getSize();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
}
(3) 二分搜索树实现的Set集合
二分搜索树在添加元素的时候不用判断添加的元素是否存在
因为二分搜索树本来就不能存重复的元素。
!!!二分搜索树详解链接?:二分搜索树
/*
* 基于二分搜索树实现的集合
*/
import 树.BinarySearchTree;
public class BstSet<E extends Comparable<E>> implements Set<E> {
private BinarySearchTree<E> bst;
public BstSet() {
// TODO Auto-generated constructor stub
bst = new BinarySearchTree<E>();
}
@Override
public void add(E e) {
// TODO Auto-generated method stub
//二分搜索树在添加元素的时候不用判断添加的元素是否存在
//因为二分搜索树本来就不能存重复的元素。
bst.add(e);
}
@Override
public void remove(E e) {
// TODO Auto-generated method stub
bst.remove(e);
}
@Override
public boolean contains(E e) {
// TODO Auto-generated method stub
return bst.contains(e);
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return bst.size();
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return bst.isempty();
}
}
(4)实例测试
统计双城记书中出现了多少个不重复的单词
import java.util.ArrayList;
/*
* 计算一本英文书中有多少个不重复的单词
*/
public class Test1 {
public static void main(String[] args) {
ArrayList<String> words=new ArrayList<>();
FileOperation.readFile("a-tale-of-two-cities.txt", words);
long starttime=System.currentTimeMillis();
LinkedSet<String> set=new LinkedSet<>();//linkset
//BstSet<String> set=new BstSet<>(); bstset
for(int i=0;i<words.size();i++) {
set.add(words.get(i));
}
long endTime=System.currentTimeMillis();
double second=(endTime-starttime)/1000.0;
System.out.println("linkset用时:"+second+"s");
//System.out.println("bst用时"+time+"s");
System.out.println("双城记共有多少单词:"+words.size());
System.out.println("双城记有多少单词:"+set.getSize());
}
}