Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:
1. 纯 key 模型
2. Key-Value 模型
首先,Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式。
常见的Map方法,例如get(Object key) ----返回 key 对应的 value;getOrDefault(Object key, V defaultValue) ----返回 key 对应的 value,key 不存在,返回默认值;remove(Object key)---- 删除 key 对应的映射关系;boolean containsValue(Object value) ----判断是否包含 value;boolean containsKey(Object key) ----判断是否包含 key。
接着,Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。Set最大的功能就是对集合中的元素进行去重。
我们试着用以上知识写道练习题。
题目:给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
思路:计算每个元素出现的次数,检查元素出现次数,若次数等于,则返回这个元素。
JAVA代码如下:
class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer>countMap=new TreeMap<>();
for(int n:nums){
int count=countMap.getOrDefault(n,0);
count++;
countMap.put(n,count);
}
for(Map.Entry<Integer,Integer>entry:countMap.entrySet()){
int e=entry.getKey();
int count=entry.getValue();
if(count==1){
return e;
}
}
return -1;
}
}