Java和C++在细节上的差异(四)(十一)

2014-11-24 02:04:05 · 作者: · 浏览: 12
t.hasNext();) {
8 String key = it.next();
9 String value = map.get(key);
10 System.out.println(value);
11 }
12 }
13 /* 结果如下:
14 value1
15 value4
16 value3 */
17
18 //基于Values的排序后输出Keys
19 publicstaticvoidmain(String[] a) {
20 Map yourMap = newHashMap();
21 yourMap.put("1", "one");
22 yourMap.put("2", "two");
23 yourMap.put("3", "three");
24
25 Map map = newLinkedHashMap();
26 List keyList = newArrayList(yourMap.keySet());
27 List valueList = newArrayList(yourMap.values());
28 Set sortedSet = newTreeSet(valueList);
29 String[] sortedArray = sortedSet.toArray(newString[0]);
30 intsize = sortedArray.length;
31
32 for(inti = 0; i < size; i++)
33 map.put(keyList.get(valueList.indexOf(sortedArray[i])), sortedArray[i]);
34
35 Set ref = map.keySet();
36 Iterator it = ref.iterator();
37 while(it.hasNext()) {
38 String i = (String) it.next();
39 System.out.println(i);
40 }
41 }

12. EnumSet和EnumMap,这两个集合可以看做是类型参数特化后的Set>和Map,V>,EnumSet没有显示的构造函数,而是通过一组工厂方法来创建了,见如下代码:

1 enumWeekdays {
2 Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
3 }
4 publicstaticvoidmain(String[] a) {
5 EnumSet es1 = EnumSet.allOf(Weekdays.class);
6 EnumSet es2 = EnumSet.noneOf(Weekdays.class);
7 EnumSet es3 = EnumSet.range(Weekdays.Thursday, Weekdays.Sunday);
8 EnumSet es4 = EnumSet.of(Weekdays.Monday,Weekdays.Saturday);
9 System.out.println("es1 = " + es1);
10 System.out.println("es2 = " + es2);
11 System.out.println("es3 = " + es3);
12 System.out.println("es4 = " + es4);
13 }
14 /* 结果如下:
15 es1 = [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday]
16 es2 = []
17 es3 = [Thursday, Friday, Saturday, Sunday]
18 es4 = [Monday, Saturday] */

13. 集合视图:顾名思义,所有的集合视图和数据库中的普通视图一样,并不存储真实是的容器元素,而只是建立一套针对原有底层集合数据的引用机制,针对所有视图的操作或底层集合的操作都会同时相互影响,如插入和删除等,但是对于视图而言,插入操作如果作用于其范围之外将会引发异常。对于不同类别的视图其操作也存在不同的限制。
1). subList:获取底层集合中某一范围的元素,如List group2 = staff.asList(10,20); 这第一个索引上的数据是被包含的,第二个索引的数据是不被包含的。如果执行了group2.clear()操作情况了视图中的数据,那么staff中这段范围内的数据也会被连同删除。对于有序集合和映射表(Map),可以使用排序顺序而不是元素位置建立子范围,如SortedSet接口声明的SortedSet subSet(E from,E to); SortedSet headSet(E to); SortedSet tailSet(E from); 注意这3个参数的类型均不是元素的索引,而是对象本身。SortedMap中也有类似的方法,如SortedMap subMap(K from,K to); SortedMap headMap(K to); SortedMap tailMap(K from)。在NavigableSet中提供更为丰富的接口,如NavigableSet subSet(E from,boolean fromInclusive,E to,boolean toInclusive); NavigableSet headSet(E to,boolean toInclusive); NavigableSet tailSet(E from,boolean fromInclusive);
2). 不可修改的视图:
Collections.unModifiableCollection();
Collections.unModifiableList(); //用于ArrayList、LinkedList
Collections.unModifiableSet(); //用于HashSet、TreeSet、LinkedHashSet
Collections.unModifiableSortedSet();//用于TreeSet
Collections.unModifiableMap(); //用于HashMap、TreeMap、LinkedHashMap
Collections.unModifiableSortedMap();//用于TreeMap
如List staff = new LinkedList(); List unmodifiableList = new Collections.un