Set集合特点:不包含重复元素,不保证有序的.而且方法都和Collection一致.
* | 取出元素的方法只有一种,迭代器.
* |--HashSet特点:哈希表数据结构,查询速度块,
* | 保证元素唯一性的方式依赖于hashcode和equals方法.
* |
* |--TreeSet特点:二叉树数据结构,可以对Set集合中元素进行排序.保证元素唯一性的方式是
* 使用对象的比较方法,结果为0的视为相同元素,不存储.
* 注意:TreeSet在存对象时,对象必须具备自然排序方法,即compareTo方法.
* 元素的排序比较方式有两种:
* 1.元素自身具备自然排序,其实就是实现了Comparable接口,重写了compareTo方法.
* 2.比较器方法,如果元素不具备compareTo方法,或者自然排序不是用户需要的排序方法,
* 就需要实现Compartor接口,重写compare方法.
*
* 另:再往集合存储对象时,通常该对象都需要覆盖hashcode,equals方法,同时实现Comparable接口,
* 建立对象的自然排序,通常还有一个方法也会重写toString()方法.
* 通常描述的是数据模型的类,比如学生,动物,书本等,属性较多,并有对应的get,set方法,通常需要重写
* 以上方法.
*
* -----------------------------------------------------------------------------
* 练习: 1.获取Set集合的最大值,通过自然排序
* 2.获取Set集合最大值,通过给定的比较器。(例如,按照字符串长度比较大小).
* 练习1思路:
* 1.通过迭代,比较每一个元素的大小.怎么比较呢?
* 2.通过以前数组比较元素大小的知识,假定一个最大值,然后依次和下一个元素做比较
* 3.将大的结果保留,继续比较,直到循环结束.
* 最值一贯思路:需要比较,并记录每次比较后较大的值。不断的重复这个动作(循环)
*
* 练习2思路:
* 1.用给定的比较器比较大小.按照需求,我们应该写一个比较器,是按照两者的长度做比较的.
* 2.其他过程同练习一是一样的用给定的比较器比较两者的大小.取最大值.
*
* 总结:
* 练习1解决问题中的注意及总结:
* 1.解决问题过程中,首先在开始定义方法时,就要想到返回值以及实际参数该写什么类型?
* 返回值的类型用Object是目前为止,没应用后面泛型知识的办法.如果是单纯的比较字符串
* 加入泛型,可以更好的解决问题.详见泛型的习题总结.
* 2.Set集合的特点,使得其取出元素的办法只有通过迭代器来完成.所以在方法中,第一件事
* 需要取出一个元素设成最大值,而不是马上进入遍历的过程.
* 3.遍历过程中,第一件事情需要设定一个临时的变量,接收每一次it.next的对象.这个变量
* 需要实现Comparable接口才能实现比较大小的功能.那么就需要把Object类型的对象向下
转型成为Comparable类型的对象.这样就能用compareTo方法比较大小了.
练习2解决问题中的注意及总结:
1.注意: 制定一个比较长度规则的比较器作为参数传进方法中(因为匿名内部类我没有写出来),在外部就新建了
比较器.
2.比较器返回的结果不是boolean,是个int数值.
*/
public class HashSetTest {
public static void main(String[] args) {
Set set_str = new HashSet();
set_str.add("abc");
set_str.add("zoaa"); //长度最长
set_str.add("zod"); //最大值
set_str.add("xy");
set_str.add("dd");
Object max = getMax(set_str);
System.out.println("最大值是:"+max);
/*练习一的输出结果:
* 最大值是:zod*/
/*练习二的方法中要注意: 制定一个比较长度规则的比较器作为参数传进方法*/
Object max2 = getMax2(set_str,new ComparatorByLen());
System.out.println("长度最长的是:"+max2);
//长度最长的是:zoaa
}
/**
* 获取Set集合中的长度最长的元素
* @param set_str 给定的Set集合
* @param com 用户给定的比较器
* @return temp 返回最长的元素
*/
public static Object getMax2(Set set_str, ComparatorByLen com) {
Iterator it = set_str.iterator();
Object max = it.next();
while(it.hasNext()){
Object temp = it.next();
/*com表示比较器,我自己写的按照我制定的规则比较大小的比较器
*这里我没有使用匿名内部类,所以就需要外界传进来一个比较器*/
if(com.compare(temp,max)>0){
max = temp;
}
}
return max;
}
/**
* 返回给定Set集合的自然排序最大值
* @param set_str 给定的Set集合
* @return max 最然排序最大的元素
*/
public static Object getMax(Set set_str) {
/*1.假定一个最大值,set_str中的任意一个元素都可以.那么怎么取出Set集合中的元素?
* 我们直到,取出Set集合中的元素,只能有一个方法,就是迭代器的next方法.*/
Iterator it = set_str.iterator();
//定义一个最大值
Object max = it.next();
//遍历set集合,比较大小
while(it.hasNext()){
//让max与每一个set的元素比大小.
/*那么问题来了?Object的对象没有compareTo方法,怎么比较大小呢?*/
/*解决办法: 想要实现compareTo方法,需要实现Comparable接口,那么我们把Object类型
*的元素,向下转型成Compable接口的类型,不就有compareTo方法了么*/
Comparable temp = (Comparable)it.next();
if(temp.compareTo(max)>0){
max = temp;
}
}
return max;
}
}
/**
* 按照字符串长度比较大小的比较器
*/
class ComparatorByLen implements Comparator{
@Override
public int compare(Object o1, Object o2) {
String str1 = (String)o1;
String str2 = (String)o2;
int temp = str1.length()-str2.length();
//这里要考虑到如果字符串长度相等的情况,要在比较两者的自然比较大小关系
return temp==0?str1.compareTo(str2):temp;
}
}
View Code