Set集合特点总结以及自然排序,比较器相关知识点 练习:Set集合最值的获取

 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

 

转载于:https://www.cnblogs.com/zyjcxc/p/5453151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值