- 写在前面:记录学习《恋上数据结构与算法》的过程。
- 课程链接地址:https://ke.qq.com/course/385223
目录
集合(Set)
接口设计
利用链表实现集合
- 添加
- 删除
- 遍历
- 测试
利用链表实现完整代码
package com.mj.set;
import com.mj.list.LinkedList;
import com.mj.list.List;
public class ListSet<E> implements Set<E> {
private List<E> list = new LinkedList<>();
@Override
public int size() {
return list.size();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public void clear() {
list.clear();
}
@Override
public boolean contains(E element) {
return list.contains(element);
}
@Override
public void add(E element) {
int index = list.indexOf(element);
if (index != List.ELEMENT_NOT_FOUND) { // 存在就覆盖
list.set(index, element);
} else { // 不存在就添加
list.add(element);
}
}
@Override
public void remove(E element) {
int index = list.indexOf(element);
if (index != List.ELEMENT_NOT_FOUND) {
list.remove(index);
}
}
@Override
public void traversal(Visitor<E> visitor) {
if (visitor == null) return;
int size = list.size();
for (int i = 0; i < size; i++) {
if (visitor.visit(list.get(i))) return;
}
}
}
利用红黑树实现集合
- 遍历
- 测试
利用红黑树实现完整代码
package com.mj.set;
import java.util.Comparator;
import com.mj.tree.BinaryTree;
import com.mj.tree.RBTree;
public class TreeSet<E> implements Set<E> {
private RBTree<E> tree;
public TreeSet() {
this(null);
}
public TreeSet(Comparator<E> comparator) {
tree = new RBTree<>(comparator);
}
@Override
public int size() {
return tree.size();
}
@Override
public boolean isEmpty() {
return tree.isEmpty();
}
@Override
public void clear() {
tree.clear();
}
@Override
public boolean contains(E element) {
return tree.contains(element);
}
@Override
public void add(E element) {
tree.add(element);
}
@Override
public void remove(E element) {
tree.remove(element);
}
@Override
public void traversal(Visitor<E> visitor) {
tree.inorder(new BinaryTree.Visitor<E>() {
@Override
public boolean visit(E element) {
return visitor.visit(element);
}
});
}
}
性能对比
- 测试
static void testSet(Set<String> set, String[] words) {
for (int i = 0; i < words.length; i++) {
set.add(words[i]);
}
for (int i = 0; i < words.length; i++) {
set.contains(words[i]);
}
for (int i = 0; i < words.length; i++) {
set.remove(words[i]);
}
}
static void test2() {
FileInfo fileInfo = Files.read("C:\\Users\\MJ Lee\\Desktop\\src\\java\\util",
new String[]{"java"});
System.out.println("文件数量:" + fileInfo.getFiles());
System.out.println("代码行数:" + fileInfo.getLines());
String[] words = fileInfo.words();
System.out.println("单词数量:" + words.length);
Times.test("ListSet", new Task() {
public void execute() {
testSet(new ListSet<>(), words);
}
});
Times.test("TreeSet", new Task() {
public void execute() {
testSet(new TreeSet<>(), words);
}
});
}
用红黑树实现集合的限制
- 元素必须具备可比较性