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
    评论
### 回答1: 在JavaSet是一种集合数据结构,它不允许重复元素,并且没有固定的顺序。然而,Java的TreeSet是一种基于红黑树数据结构的Set实现,它可以自定义排序规则。 TreeSet是一个有序的集合,它维护了一个基于元素的红黑树结构。默认情况下,TreeSet按照元素的自然顺序进行排序。例如,如果元素是整数,则按照从小到大的顺序排列;如果元素是字符串,则按照字典顺序进行排序。 但是,TreeSet也可以使用自定义的Comparator接口实现来指定排序规则。Comparator接口定义了一个compare()方法,它接受两个参数并返回一个int。如果第一个参数小于第二个参数,则返回负整数;如果第一个参数大于第二个参数,则返回正整数;如果两个参数相等,则返回0。 例如,我们可以创建一个按照字符串长度进行排序的TreeSet,如下所示: ```java TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }); treeSet.add("hello"); treeSet.add("world"); treeSet.add("java"); ``` 在这个例子,我们创建了一个TreeSet并使用了一个自定义的Comparator实现。这个Comparator实现比较两个字符串的长度,并按照长度从小到大的顺序排序。 最终,这个TreeSet的元素将按照长度从小到大的顺序排列,输出结果为: ``` [java, hello, world] ``` ### 回答2: 在使用Java集合的TreeSet时,我们默认使用其自然排序规则对元素进行排序。但有时候,我们需要根据自定义的规则对元素进行排序,这时我们可以使用TreeSet提供的自定义排序方法——Comparator。 Comparator是一个接口,其定义了两个方法,分别是compare()和equals()。其,compare()方法接收两个参数,分别是要比较的对象x和y,这两个对象需要实现Comparator接口;equals()方法用于比较两个对象是否相等。 假设有一个存放Person对象的TreeSet集合,我们需要根据Person的年龄属性进行升序排序,可以通过以下步骤实现: 1. 定义一个Person类,包含name和age两个属性,以及相应的getter和setter方法; 2. 在Person类实现Comparator接口,并重写compare()方法,在方法对年龄属性进行比较; 3. 创建一个TreeSet集合,并在构造函数传入自定义的Comparator对象; 4. 将多个Person对象添加到TreeSet集合。 具体的代码实现如下: ``` import java.util.*; class Person implements Comparator<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } @Override public int compare(Person p1, Person p2) { if (p1.getAge() > p2.getAge()) { return 1; } else if (p1.getAge() < p2.getAge()) { return -1; } else { return 0; } } } public class TreeSetDemo { public static void main(String[] args) { TreeSet<Person> set = new TreeSet<Person>(new Person()); set.add(new Person("张三", 28)); set.add(new Person("李四", 20)); set.add(new Person("王五", 25)); for (Person p : set) { System.out.println(p.getName() + " " + p.getAge()); } } } ``` 在代码,我们定义了一个Person类,它实现了Comparator接口,并重写了compare()方法,根据Person对象的age属性进行比较。在主方法,我们创建了一个TreeSet集合,并在其添加了多个Person对象,它们会被按照年龄的升序排序。最后,我们通过foreach循环遍历集合的所有元素,并输出它们的name和age属性。 需要注意的是,在使用自定义比较器时,如果想要保证集合没有重复元素,我们还需要在Person类重写equals()方法,并根据name和age两个属性进行比较。 ### 回答3: 在使用Java集合的TreeSet时,数据默认情况下是按照自然顺序进行排序的。但是在某些情况下,我们可能希望按照自己定义的规则进行排序。这时,就需要使用TreeSet的自定义排序规则。 自定义排序规则需要我们实现Comparator接口的compare方法。该方法用于对实现了Comparable接口的对象进行比较。因此,我们需要在自定义类实现该接口,并重写其的compare方法。 接下来,我们以Student类为例,介绍如何实现TreeSet的自定义排序规则。假设我们希望按照学生的分数进行从高到低的排序。 首先,在Student类实现Comparable接口 public class Student implements Comparable<Student>{ private String name; private int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public int compareTo(Student o) { return o.score - this.score; } } 在该类,我们通过重写compareTo方法,实现了按照学生分数进行排序的规则。 接下来,在使用TreeSet时,我们需要传入一个Comparator对象,该对象用于指定TreeSet元素的排序规则。示例代码如下: TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o2.getScore() - o1.getScore(); } }); 在该代码,我们通过匿名类的方式实现了Comparator接口,并重写了其的compare方法。通过该方法,我们指定了从高到低的排序规则。 通过以上的示例代码,我们可以看出,自定义排序规则的具体实现可以根据具体情况进行调整。而在该实现,我们需要注意以下几点: 1. 实现Comparable接口,用于指定对象的默认排序规则。 2. 实现Comparator接口,在特定情况下自定义排序规则。 3. 在使用TreeSet时,需要传入一个Comparator对象,用于指定排序规则。 以上就是Java集合类之set的treeset之自定义排序规则的详细介绍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值