这几天看代码碰到了HashMap,HashSet,TreeMap,TreeSet等等这样的结构,虽然早有耳闻,但一直不是很清楚怎么用的,是个什么意思。这篇文章就想写写这 集合(Set) 和 映射(Map) 是个什么东西。
其实集合 和 映射 都算是一种容器,一种数据结构,可以来存放数据的容器。
-
集合(Set)
特点是 可以去重(一般来说是这样, 但还有他的对立面: 多重集合,就是允许放入重复的元素,但多重集合很少用,目前还没有碰到过,了解这么一个概念就好。),即不允许放入重复的(相等的)元素。
- 相关应用场景:
- 店里客户统计(相同客户只统计一次),
- 文本词汇量统计(这里的自然语言处理,比如英文里什么相同单词的时态,人称数的变化等等,怎么判定他们相等,感兴趣的可以去看看)
- 网站IP统计, 等等。
- 底层实现: (在java里)
- 可以基于链表, 哈希表实现: (HashSet, LinkedHashSet)
这样实现的集合没有顺序可言。 即是 一种 无序集合。 - 可以基于搜索树实现: (或者说基于 树 结构来实现) (TreeSet)
这样实现的集合可以有顺序,即是一种 有序集合。
一般来说,性能优越是: 哈希表实现 > 树实现 > 链表实现 。
再来看看LeetCode上的804号问题来帮助理解:
- 题目 : 唯一的摩尔斯密码
插图片- 思路:
从单词列表中依次拿出每个单词,对应成相应的摩斯密码后,将这个密码加入到 一个集合中(不可以放入重复的值), 放回这个集合中的元素个数即可。 - 上代码
import java.util.TreeSet;
class Solution {
public int uniqueMorseRepresentations(String[] words) {
TreeSet<String> set = new TreeSet<String>();
String[] codes = {
".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...",