您的位置:首页 > 其它

类集框架:List、Set、Map、Iterator、Comparator(重点)

2014-03-06 12:45 417 查看
一、类集框架作用

类集框架包含了一组标志接口,用户通过这些接口方便对基本类集(动态数组、链接表、树)进行高效率的实现。Java为类集框架提供了几个标准的实现工具,例如LinkedList、HashSet、TreeSet等,具体如下:



注意:Collection、Set、List都有iterator()方法,因此继承它们的类(TreeSet、HashSet、ArryList、LinkedList)和实现它们的接口(SortedSet)都保留了此方法,都可以通过迭代器iterator()进行迭代输出。一般的,实例化集合时,通常使用如下方法:

Set set = new HashSet();

Set set = new TreeSet();

List list = new ArryList();

List list = new LinkedList();由上可见,对象引用一般为Set和List。





注意:所有的映射都没有iterator()方法,因此若如果对映射进行迭代输出,则应先通过Map中的方法,转换为Set类型,再用集合的iterator()方法。

Map:


二、实现工具简介:

Collection——集合,传入参数为1个:

1.Collection为最大的接口,含有一个迭代器的方法iterator(),因此可通过迭代器对集合中的元素按照一定顺序排序;

2.TreeSet和SortedSet定义的集合,使用迭代器输出集合元素时,会按照自然顺序输出;也可定义一个实现比较规则(Comparator接口)的类,复写比较方法public int compare(Object o1, Object o2),根据返回值(-1,0,1)实现正序反序的输出;

3.其他的实现工具,使用迭代器输出集合元素时,顺序不确定(即使定义了比较规则,输出顺序也是不确定的)。

Map——映射,传入参数为2个(Key和Value):

1.Map为最大的接口,不含有迭代器方法iterator(),因此元素输出时不方便,需要转换为集合,才可使用此迭代方法;

2.Map映射含有的方法中,有2个方法的返回值为set集合:

Set<Map.Entry<K,V>> entrySet()   返回此映射中包含的映射关系的 set 视图。返回的 set 中的每个元素都是一个 [code]Map.Entry类型
。[/code]
Set<K> keySet()   返回此映射中包含的键的 set 视图。返回的 set 中的每个元素都是一个 [code]K类型
。[/code]

3.TreeMap和SortedMap在不定义比较规则(Comparator接口),使用迭代器输出映射元素时,会按照自然顺序输出;也可定义一个实现比较规则(Comparator接口)的类,复写比较方法public int compare(Object o1, Object o2),根据返回值(-1,0,1)实现正序反序的输出;

4.其他实现工具,使用使用迭代器输出集合元素时,顺序不确定(即使定义了比较规则,输出顺序也是不确定的)。

三、示例

1.TreeSet和HashSet的输出比较

import java.util.*;

class SetDemo 

{
public static void main(String[] args) 
{
Set set= new TreeSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
for(Iterator iter = set.iterator();iter.hasNext();)
{
String s = (String)iter.next();
System.out.print(s+“  ”);
}

}

}

输出:a  b  c  d  

可以看出按默认的自然顺序输出

若把实例化定义为:Set set= new HashSet();

输出:d  b  c  a   

可以看出排序不规则

2.TreeSet实现反序输出

由于TreeSet含有一个输入参数为比较器的构造方法(注意:其他类(HashSet、LinkedList、ArryList)不含有此构造方法,也就是说只有TreeSet才可实现集合的反序排列):



public TreeSet(Comparator<? super E> c)   构造一个新的空 set,该 set 根据指定的比较器进行排序。


因此可以通过设置比较器,实现TreeSet集合中元素的反序排列。

import java.util.*;

class SetDemo 

{
public static void main(String[] args) 
{
Set set= new TreeSet(new MyComparator());
set.add("a");
set.add("b");
set.add("c");
set.add("d");
for(Iterator iter = set.iterator();iter.hasNext();)
{
String s = (String)iter.next();
System.out.print(s+"  ");
}

}

}

class MyComparator implements Comparator

{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2); //或者 return s2.compareTo(s1);
}

}

结果:d  c  b  a

3.TreeMap和HashMap的输出比较

import java.util.*;

class  TreeMapAndHashMapDemo

{
public static void main(String[] args) 
{
Map map = new TreeMap();
map.put("a",new Integer(1));
map.put("b",new Integer(2));
map.put("c",new Integer(3));
map.put("d",new Integer(4));

Set set= map.entrySet();

for(Iterator iter = set.iterator();iter.hasNext();)
{
Map.Entry mapEntry = (Map.Entry)iter.next();

String key = (String)mapEntry.getKey();
Integer value =  (Integer)mapEntry.getValue();

System.out.print(key+", "+value);
System.out.println();
}

}

}

结果:

a, 1

b, 2

c, 3

d, 4   可见,按照自然顺序排列

若把实例化Map map = new TreeMap();换成 Map map = new HashMap();

结果:

d, 4

b, 2

c, 3

a, 1  可见,排列顺序不规则

4.TreeMap实现反序输出

由于TreeMap含有一个输入参数为比较器的构造方法(注意:其他类(HashMap)不含有此构造方法,也就是说只有TreeMap才可实现集合的反序排列):



public TreeMap(Comparator<? super K> c)  构造一个新的空映射,该映射根据给定的比较器进行排序。


因此可以通过设置比较器,实现TreeMap映射中元素的反序排列。

import java.util.*;

class  MapDemo

{
public static void main(String[] args) 
{
Map map = new TreeMap(new MyComparator());
map.put("a",new Integer(1));
map.put("b",new Integer(2));
map.put("c",new Integer(3));
map.put("d",new Integer(4));

Set set= map.entrySet();

for(Iterator iter = set.iterator();iter.hasNext();)
{
Map.Entry mapEntry = (Map.Entry)iter.next();

String key = (String)mapEntry.getKey();
Integer value =  (Integer)mapEntry.getValue();

System.out.print(key+", "+value);
System.out.println();
}

}

}

class MyComparator implements Comparator

{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2);
}

}

结果:

d, 4

c, 3

b, 2

a, 1

5.Map通过迭代器输出时向Set的转换的两种方式

①通过keySet()方法

import java.util.*;

class  MapDemo

{
public static void main(String[] args) 
{
Map map = new TreeMap(new MyComparator());
map.put("a",new Integer(1));
map.put("b",new Integer(2));
map.put("c",new Integer(3));
map.put("d",new Integer(4));

Set set= map.keySet();

for(Iterator iter = set.iterator();iter.hasNext();)
{
String key = (String)iter.next();
Integer value = (Integer)map.get(key);

System.out.print(key+", "+value);
System.out.println();
}

}

}

class MyComparator implements Comparator

{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2);
}

}

结果:

d, 4

c, 3

b, 2

a, 1

②通过entrySet()方法

详见示例4。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: