`
tangleilei
  • 浏览: 14328 次
  • 来自: 上海
社区版块
存档分类
最新评论

TreeSet的Comparator排序

阅读更多
TreeSet的两种排序方式

(1). 让元素本身具有比较性

       元素本身要实现Comparable接口并实现里面的compareTo方法以保证元素本身具有比较性

(2). 让容器自身具有比较性

       当元素本身不具有比较性或者具备的比较性不是所需要的,就在TreeSet建立实例的时候,传入Comparator接口的实现子类的实例。这个Comparator子类必须实现compare方法。



(3). 元素的可存储性

[1]. 自定义的类,如果重写了hashCode和equals两个方法,可以存入HashSet容器

[2]. 自定义的类,如果实现了Comparable的compareTo()方法,可以存入TreeSet容器。

【总结】如果自定义的类既重写了hashCode和equals,又实现了compareTo,那么这个类的元素既可以存入HashSet容器,也可以存入TreeSet容器。

【比较优先级】当元素和容器本身都具有比较性的时候,容器比较器优先

——————————————————————————————————————————————



1). Comparator应用的背景

如果对象元素不具有比较性 (就是存入集合的元素所在的类本身没有实现Comparable接口)或者对象元素自身的比较性不符合需求(也就是不符合需求中的排序规则)。并且集合中的元素类不能被修改。此时就要使用Comparator这个接口来达到所需的排序功能。

2). Comparator的使用方式

(1). TreeSet的构造方法

[1]. public TreeSet()

构造一个空参的TreeSet。这个TreeSet根据自然顺序(默认的顺序)进行排序

[2]. public TreeSet(Comparator<?super E>comparator)

    构造一个TreeSet。这个TreeSet根据Comparator比较器中的规则进行排序

(2). Comparator接口介绍

public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

}

(3). 示例代码的普通写法

【示例代码】学生姓名先排序,如果姓名相同,按照年龄排序





[java] view plaincopy

01.class MyComparator implements Comparator{ 
02.     public int compare(Object o1, Object o2){ 
03.        if(!((o1 instanceof Student)&&(o2 instanceof Student))){ 
04.             throw new RuntimeException("Sorry"); 
05.        } 
06.         Students1 =(Student)o1; 
07.        Students2 =(Student)o2; 
08.         
09.        int num =s1.getName().compareTo(s2.getName()); 
10.         if(num ==0) 
11.            return s1.getAge() -s2.getAge(); 
12.         return num; 
13.    } 
14. } 
15.  
16. class TreeSetDemoII{ 
17.    public static void sop(Object o){ 
18.         System.out.println(o); 
19.    } 
20.   
21.    public static void main(String[] args){ 
22.         TreeSetts =new TreeSet(new MyComparator()); 
23.        ts.add(new Student("lisi02", 22)); 
24.         ts.add(new Student("lisi007", 20)); 
25.        ts.add(new Student("lisi09", 19)); 
26.         ts.add(new Student("lisi09", 18)); 
27.        
28.         Iteratorit =ts.iterator(); 
29.        while(it.hasNext()){ 
30.             sop(it.next()); 
31.        } 
32.     } 
33.} 


 



打印结果:



【比较优先级】当元素和容器本身都具有比较性的时候,容器比较器优先

这里面Student类和TreeSet容器都具有比较性,Student是age主条件----age相同,比较name

容器本身是:name主条件----name相同,比较age

返回的排序结果就是容器比较性的排序。

2.    TreeSet总结

1). TreeSet的特点

(1). 可以对元素进行排序

       有两种排序方式。

(2). TreeSet保证元素的唯一性依据

       在实现的Comparable的compareTo或者Comparator的compare方法中,如果这两个方法的返回值为0,那么TreeSet就认为这两个元素一样。按照Set的唯一性规则,在一次重复的元素不能被添加到TreeSet这个集合中。

2). TreeSet的两种排序方式

(1). 让元素本身具有比较性

       元素本身要实现Comparable接口并实现里面的compareTo方法以保证元素本身具有比较性

(2). 让容器自身具有比较性

       当元素本身不具有比较性或者具备的比较性不是所需要的,就在TreeSet建立实例的时候,传入Comparator接口的实现子类的实例。这个Comparator子类必须实现compare方法。



(3). 元素的可存储性

[1]. 自定义的类,如果重写了hashCode和equals两个方法,可以存入HashSet容器

[2]. 自定义的类,如果实现了Comparable的compareTo()方法,可以存入TreeSet容器。

【总结】如果自定义的类既重写了hashCode和equals,又实现了compareTo,那么这个类的元素既可以存入HashSet容器,也可以存入TreeSet容器。


分享到:
评论

相关推荐

    java泛型 用了treeset

    使用TreeSet和Comparator,编写TreeSetTest2类,要求对TreeSet中的元素1-元素10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列。 如果需要的话可以下载,有写成文章的。有写了一点中文...

    String,number,String+number的Comparator排序

    `Comparator`在Java集合框架中广泛应用于`Collections.sort()`, `TreeSet`和`TreeMap`等,允许我们灵活地控制元素的排序。对于复杂的排序需求,`Comparator`是Java程序员的有力工具,它可以适应各种场景,包括处理...

    解决TreeSet类的排序问题

    TreeSet提供两种排序方式:自然排序和定制排序。 1. 自然排序: 自然排序是TreeSet默认的排序方式。当向TreeSet中添加元素时,它会调用这些元素的`compareTo(Object obj)`方法进行比较。这个方法源自`Comparable`...

    List对象集合的排序:比较器Comparator(简单例子)

    `Comparator`不仅可以用于`List`的排序,还可以在其他需要比较元素的场景中发挥作用,如`TreeSet`、`PriorityQueue`以及`Arrays.sort()`等。此外,`Comparator`还支持链式调用,可以同时比较多个属性,比如先比较...

    浅谈TreeSet中的两种排序方式

    在使用 TreeSet 时,我们可以通过实现 Comparable 接口或提供Comparator 对象来指定排序规则。下面,我们将详细介绍 TreeSet 中的两种排序方式:自然排序和定制排序。 自然排序 自然排序是指通过实现 Comparable ...

    TreeSet 不用自然排序自己做比较器

    Comparator&lt;String&gt; com = new Comparator&lt;String&gt;(){ public int compare(String o1,String o2) { return o1.length()-o2.length(); } }; TreeSet ts = new TreeSet(com); ts.add("string"); ts.add(...

    HashSet和TreeSet_围墙之外

    默认情况下,元素会按照它们的自然顺序(即Comparable接口定义的顺序)排序,如果元素不支持自然排序,可以在创建TreeSet时传入自定义的Comparator。TreeSet的插入、删除和查找操作的时间复杂度为O(logn),因为内部...

    java Comparator 用法 例子

    Java中的Comparator接口是排序的关键工具,它允许程序员自定义对象的比较规则,从而在集合、数组或树结构(如TreeSet、TreeMap)中实现定制化的排序。在Java的Collections框架中,Comparator扮演着重要的角色,特别...

    排序之HashSet和TreeSet的区别

    自然顺序是指元素本身的`Comparable`接口实现,如果元素类型不实现`Comparable`,则需要在创建`TreeSet`时提供一个`Comparator`。`TreeSet`的插入、删除和查找操作的时间复杂度为O(log n),因为树结构提供了较好的...

    JCF(List、Set、Map)学习,实现了<key,value>按value排序噢

    本次我们关注的是Java集合框架中的三类接口:List、Set和Map,以及如何实现它们的特定功能,特别是关于`TreeSet`和`TreeMap`的按值排序。标题中提到的“JCF(List、Set、Map)学习,实现了,value&gt;按value排序”是一个...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...

    java 集合框架(TreeSet练习)

    2. **自定义比较器**:如果我们需要自定义元素的排序规则,可以通过传递一个实现了`Comparator`接口的对象给`TreeSet`的构造函数来实现。`compare()`方法在这个比较器中定义了元素的比较逻辑。 3. **基本操作**:`...

    浅谈java中的TreeMap 排序与TreeSet 排序

    在第二个示例中,创建了一个 `TreeSet` 并传入了一个自定义的 `Comparator`,这个比较器用于比较 `Object` 类型的值,将其转换为整数并进行比较,以实现倒序排序。当添加元素到 `TreeSet` 中时,它们会根据比较器的...

    javaTreeSet实现图书管理系统

    对`Library`的`TreeSet&lt;Book&gt;`,可以通过自定义比较器(Comparator)实现按借出次数排序。每个`Book`对象可以维护一个计数器,表示被借出的次数。在比较器中,比较这个计数器,从而实现排序。然后遍历排序后的`...

    (TreeSet) s.subSet(608, true, 611, true)

    8. **自定义排序**:通过传递Comparator实例给TreeSet构造函数,可以自定义元素的排序方式。 9. **实际应用**:TreeSet常用于需要排序且对性能有较高要求的场景,例如数据库索引、优先队列等。 以上就是关于标题和...

    treeset 和 hashlist 实现的扑克牌游戏

    在具体实现时,我们可能会创建一个`Card`类表示扑克牌,包含花色和点数属性,并重写`Comparable`接口或提供`Comparator`来确定扑克牌的排序规则。然后,创建一个`TreeSet&lt;Card&gt;`实例来存储和管理所有的牌。当需要...

    Java 对象排序详解.rar_java 对象排序_对象_排序

    总的来说,Java提供了多种方式对对象进行排序,包括ArrayList的`Collections.sort()`,HashSet的转换和排序,以及TreeSet的自然排序和Comparator排序。理解这些机制可以帮助我们更好地控制数据结构的排序行为,从而...

    比较器Comparator简单用法

    这个接口在处理集合类,如`ArrayList`、`TreeSet`或`PriorityQueue`时,尤其有用,当我们需要根据特定的标准进行排序,而不是默认的自然顺序时。在给定的"比较器Comparator简单用法"主题中,我们将深入探讨如何使用`...

    Java中Comparable和Comparator 2种实现方式学习

    在实际编程中,`Comparator`常用于集合框架的排序方法,如`Collections.sort()`或`TreeSet`的构造函数。通过传入自定义的`Comparator`实例,我们可以改变默认的排序逻辑。 总的来说,`Comparable`和`Comparator`都...

    java集合-TreeSet的使用

    或者,可以在创建 TreeSet 时提供一个比较器(Comparator)来指定自定义的排序规则。 唯一性:TreeSet 中不允许重复元素,每个元素都必须是唯一的。如果将重复元素添加到 TreeSet 中,后面的重复元素将被忽略。 ...

Global site tag (gtag.js) - Google Analytics