在sun的api中,map是不支持直接存放相同的key的,相同key会被后一个key替代的,但是我们可以通过一些工具包实现这样的功能,
google基于java1.6的类库集合的扩展项目–guava,其中com.google.common.collect包就支持这样的操作.下面就直接看代码:
public class NewSetTest {
/**
* ArrayuListMultiMap的使用,
* 相当于map的 <key,List> 形式,返回List视图
*/
@Test
public void test1(){
ArrayListMultimap<Integer,Object> amap = ArrayListMultimap.create();
amap.put(1, "hello");
amap.put(1, "guava");
amap.put(2, "stydy");
// System.out.println(amap);//{1=[hello, guava], 2=[stydy]}
//get(key) 得到 collection 对象
List<Object> list = amap.get(1);
System.out.println(list);//[hello, guava]
}
/**
* HashMultimap 实现往map中添加重复的key,这个是与set是不同的
*/
@Test
public void test2(){
HashMultimap<Integer,Object> hmap = HashMultimap.create();
hmap.put(1, "hello");
hmap.put(1, "guava"); //可以添加重复的key,不会被替换
hmap.put(2, "stydy");
//由get(key) 得到Set视图
Set<Object> set = hmap.get(1);
//entries方式遍历,遍历了3次
for(Entry<Integer, Object> entry:hmap.entries()){
Integer key = entry.getKey();
Object value = entry.getValue();
// System.out.print(key+":"+value+" ");//1:hello 1:guava 2:stydy
}
//转成asMap后进行遍历,遍历了两次
Map<Integer, Collection<Object>> asMap = hmap.asMap();
for (Entry<Integer,Collection<Object>> entry : asMap.entrySet()) {
Integer key = entry.getKey();
Object value = entry.getValue();
System.out.print(key+":"+value+" ");//1:[hello, guava] 2:[stydy]
}
}
/**
* Multiset 实现往set中添加重复的元素
*/
@Test
public void test3(){
Set<Integer>set = new HashSet<>();
set.add(3);
set.add(2);
set.add(2);
set.add(4);
// System.out.println(set);//[2, 3, 4]
Multiset<Integer>mset = HashMultiset.create();
mset.add(3);
mset.add(2);
mset.add(2);
mset.add(4);
// System.out.println(mset);//[2 x 2, 3, 4]
//**----Multiset看做map时候的功能-----*//
//elementSet 返回不重复的元素
Set<Integer> elementSet = mset.elementSet();
// System.out.println(elementSet);//[2, 3, 4]
//entrySet 返回重复的元素
Set<com.google.common.collect.Multiset.Entry<Integer>> entrySet = mset.entrySet();
System.out.println(entrySet);//[2 x 2, 3, 4]
}
/**
* Multiset实现统计某个元素的个数
*/
@Test
public void test4(){
List<Integer>list = new ArrayList<>();
list.add(3);
list.add(2);
list.add(2);
list.add(4);
//Multiset的addAll方法以及统计指定元素的个数的方法
Multiset<Integer>mset = HashMultiset.create();
mset.addAll(list);
// System.out.println(mset);//[2 x 2, 3, 4]
//统计某个元素的个数
int count = mset.count(2);
// System.out.println("2的个数为 = "+count);//2的个数为 = 2
//直接设置某个元素的个数
mset.setCount(2, 1);
System.out.println("mset = "+mset);//mset = [2, 3, 4]
}
/**
* BiMap的使用:
* BiMap可以使得map的value为唯一,并且可以通过value得到key
*/
@Test
public void test5(){
BiMap<String,Integer>bmap = HashBiMap.create();
bmap.put("zhangsan", 3);
bmap.put("li", 4);
bmap.put("wang", 2);
// System.out.println(bmap);//{wang=2, zhangsan=3, li=4}
//通过value的到key
String key = bmap.inverse().get(4);
// System.out.println(key);//li
}
}
`