`
cbh735
  • 浏览: 14125 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

“社会”中的比较—-TreeSet实现对象自动排序

阅读更多
/**
* 对于人来说,在一个社会上,都会出现各种各样的排名,学校有学习排名,公司有国内排名,世界排名,而这个排名是要社会和他人这个前提下进行
* 如果,脱离了这个大环境,那么就无法跟其他人比了,其实,要说明的就是集合中有排名的情况,而且大都会不自然滴进行,那么java编程中,如何对集合
* 进行排序呢?一般这种情况都采用Set接口的实现TreeSet类来做这个工作,而java编程中已经将它封装好了,这个类有两种排序方式,谓之:自然排序,客户排序
* 先说自然排序,只要放进去的对象遵照某种规则,而这里讲的规则,其实是说,一般情况下,放Integer,String,Double等,它都会自动排序
* 因为排序的原理是这样的,TreeSet首先调用对象的compaerTo()方法来比较集合中对象的大小,然后进行升序排列,这就是自然排序。
* 有必要说下compaerTo()方法,a.compaerTo(b),前大于后者为1,小者为-1,相等为0,而java回自动根据这种返回值进行排序
*/
package com.cbh.collection_test;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* @author cbh java编程网 http://www.haohaoblog.com
*/
public class Man implements Comparable{
//没有实现接口时,对放进去的对象在第二次的时候会报错:ClassCastException
        private String speak;
        private int run;
        Man(String speak,int run)
        {
            this.speak=speak;
            this.run=run;
        }
        public String getSpeak() {
            return speak;
        }
        public void setSpeak(String speak) {
            this.speak = speak;
        }
        public int getRun() {
            return run;
        }
        public void setRun(int run) {
            this.run = run;
        }
        public boolean equals(Object one)
        {
            if(this==one)return true;
            if(!(one instanceof Man))return false;
            final Man man=(Man)one;
            if(this.speak.equals(man.getSpeak())&&this.run==man.getRun())
            {
                return true;
            }
            else return false;
        }
        public int hashCode()
        {
            int code;
            code=(speak==null?0:speak.hashCode());
            code=10*code+run;
            return code;
        }//之前说过了,只有同时覆盖了equals和hashCode方法才能真正实现Set的元素不唯一确定
        public int compareTo(Object o)
        {
            Man man=(Man)o;
            if(this.speak.compareTo(man.getSpeak())>0){return 1;}
            if(this.speak.compareTo(man.getSpeak())<0){return -1;}
            if(this.run>man.getRun()){return 1;}
            if(this.run<man.getRun()){return -1;}
            return 0;
        }//实现Comparable接口,从而让Set能对放入的元素进行确认并排序。此方法为Comparable接口唯一的方法
//这个方法在具体的main函数中不会被对象实例调用,但是java编程中,有这种机制可以自动调用该方法
        public static void main(String[] args) {
            Set<Man> set=new TreeSet<Man>();
            Man man1=new Man("speak1",100);
            Man man2=new Man("speak2",120);
            Man man3=new Man("speak3",150);
            Man man4=new Man("speak4",200);
            set.add(man1);
            set.add(man2);
            set.add(man3);
            set.add(man4);
//            man4.setRun(130);修改放进去的对象的值后,不改变原来的排序,而Man这个类提供了可以修改值的方法,所以,TreeSet不适合
//用来存放可变类的对象及其进行的排序,因为不能对修改后的对象进行重新排序。
            Iterator<Man> it=set.iterator();
            while(it.hasNext())
            {
                Man m=(Man)it.next();
                System.out.println(m.getSpeak()+":"+m.getRun());
            }
            Set<Integer> set1=new TreeSet<Integer>();
            set1.add(1);
            set1.add(4);
            set1.add(2);
            set1.add(3);
            set1.add(8);
            set1.add(6);
//            set1.add("123");自然排序中放入集合需是同类型的对象,而这类对象必须是实现了Comparable接口的,Integer,String,Double等默认实现了这个接口
            Iterator<Integer> it1=set1.iterator();
            while(it1.hasNext())
            {
                System.out.println(it1.next());
            }
        }
}
/**输出的结果是:
speak1:100
speak2:120
speak3:150
speak4:130
1
2
3
4
6
8
*/

/**
* 下面说下,第二种排序,客户排序,主要是实现一个Comparator接口,这个接口只有一个方法:int compare(T o1, T o2);
* 用判断两个对象之间的大小,从而进行排序,为什么叫做客户排序呢?笔者的理解,可能是可以更加客户的需求来改变排序吧!即可以给排序的对象
* 设定特定的类型,其实说到底,这两种方法貌似表现出来的结果都一样
*/
class Kehupaixu implements Comparator<Man>
{

    public int compare(Man o1, Man o2) {
        if(o1.getSpeak().compareTo(o2.getSpeak())<0){return -1;}
        if(o1.getSpeak().compareTo(o2.getSpeak())>0){return 1;}
        return 0;
    }//根据speak变量来排序,实现这个集的排序
    public static void main(String[] args) {
        Set<Man> set=new TreeSet<Man>(new Kehupaixu());
        Man man1=new Man("speak1",100);
        Man man2=new Man("speak7",120);
        Man man3=new Man("speak5",150);
        Man man4=new Man("speak4",130);
        set.add(man1);
        set.add(man2);
        set.add(man3);
        set.add(man4);
        Iterator<Man> it=set.iterator();
        while(it.hasNext())
        {
            Man man=it.next();
            System.out.println(man.getRun()+man.getSpeak());
        }
    }
}
分享到:
评论

相关推荐

    学生成绩排序(TreeSet方式实现)

    这样,当我们创建一个`TreeSet&lt;Student&gt;`时,`TreeSet`会根据`compareTo`方法自动对学生对象进行升序排序(默认是最小到最大)。 接下来,我们可以创建一个`TreeSet&lt;Student&gt;`实例,添加学生对象,然后遍历`TreeSet...

    javaTreeSet实现图书管理系统

    由于`TreeSet`自动排序,可以根据书名、作者或出版日期等进行排序。 - **借书卡办理**:创建一个`Card`类表示借书卡,包含持卡人信息。每个持卡人可以有一个`TreeSet&lt;Book&gt;`记录他们的借阅历史。 3. **借书,还书*...

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

    TreeSet基于红黑树实现,自动维护元素的排序。默认按照元素的自然顺序或自定义比较器进行排序。 3. **Map**: 存储键值对,如HashMap和TreeMap。HashMap使用哈希表实现,不保证键值对的顺序;而TreeMap基于红黑树,...

    TreeSet 红黑树结构算法

    TreeSet 红黑树结构算法是 Java 中的一种数据结构,它是基于红黑树数据结构的实现。红黑树是一种自平衡的排序二叉树,它可以保证快速检索指定节点。TreeSet 和 TreeMap 之间存在着紧密的关系,下面我们将详细讲解 ...

    【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip

    当我们在`TreeSet`中存储自定义类型的对象时,若想让`TreeSet`自动按照我们的需求排序,就需要让这些对象所属的类实现`Comparable`接口。具体实现方式是在类中重写`compareTo()`方法,根据业务逻辑定义比较规则。...

    浅谈TreeSet中的两种排序方式

    TreeSet 是 Java 中一种基于树形结构的 Set 实现,它具有自动排序的功能。在使用 TreeSet 时,我们可以通过实现 Comparable 接口或提供Comparator 对象来指定排序规则。下面,我们将详细介绍 TreeSet 中的两种排序...

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

    ArrayList是Java中实现List接口的一个动态数组,它允许我们在任何位置插入和删除元素。Java提供了一个内置的方法`Collections.sort()`,可以方便地对ArrayList中的元素进行排序。这个方法使用了快速排序或归并排序...

    Java实现储存对象并按对象某属性排序的几种方法示例

    下面将详细介绍三种在Java中实现这一目标的方法,以及如何使用这些方法来优化排序过程。 **第一种方法:使用`TreeSet`** `TreeSet`是Java集合框架中的一个有序集合,它会自动对其中的元素进行排序。对于基本数据...

    解决TreeSet类的排序问题

    这个方法源自`Comparable`接口,任何希望在TreeSet中进行排序的类都应当实现这个接口。在`compareTo()`方法中,需要定义比较规则,通常比较的是对象的属性。例如,对于数值类型,可以按照数值大小比较;对于字符串,...

    Java对象排序中文排序SortedSet排序使用和源码讲

    如果你的对象包含一个表示中文的字符串字段,可以在类中实现Comparable接口,重写compareTo方法。例如: ```java public class Person implements Comparable&lt;Person&gt; { private String name; // 构造函数、...

    java 按对象属性排序

    Java中的`Comparable`接口定义了`compareTo()`方法,用于比较对象的顺序。当我们需要对一个类的对象进行自然排序时,可以实现这个接口。例如,在`User`类中,如果我们有一个`age`属性,我们可以这样实现: ```...

    Java TreeSet实现学生按年龄大小和姓名排序的方法示例

    Java 中的 TreeSet 是一种自动排序的集合类,可以根据 Comparable 接口来比较元素的顺序。在本文中,我们使用 TreeSet 来存储学生对象,并自动排序按照年龄大小和姓名的顺序。 本文展示了如何使用 Java 的 TreeSet...

    java 对象 排序

    - 例如,如果你有一个`Person`类,你可以实现`Comparable&lt;Person&gt;`接口,然后在`compareTo()`方法中比较`Person`的年龄或姓名等属性来决定排序顺序。 2. **使用Comparator接口**: - 当你不想改变类的源代码(即...

    492.490.JAVA基础教程_常用类-自定义类实现Comparable自然排序(492).rar

    当一个类实现了`Comparable`接口后,其对象可以在使用了`Comparator`接口的集合类(如`TreeSet`或`TreeMap`)中自动进行自然排序。这意味着集合中的对象会按照`compareTo`方法定义的顺序进行排列。 **自定义类与...

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

    在Java编程语言中,`TreeMap` 和 `TreeSet` 是两种基于红黑树数据结构实现的集合类,它们都提供了自动排序的功能。本文将详细探讨 `TreeMap` 和 `TreeSet` 的排序机制以及如何自定义排序规则。 首先,`TreeMap` 是...

    SelectCityDome仿美团网,探索ListView的A-Z字母排序功能实现选择省份或者城市AndroidStudio版本已修改为23.zip

    开发者需要先对省份和城市的名称进行排序,这通常可以通过Java的Collections.sort()方法完成,该方法接受一个List和一个Comparator对象,Comparator用于定义比较规则,即按照字母顺序排序。如果数据量较大,还可以...

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

    1. **TreeSet的特性**:TreeSet自动排序元素,不允许插入null值,并且保证了集合的唯一性。元素按照它们的自然顺序排序,或者通过提供Comparator进行自定义排序。 2. **红黑树原理**:TreeSet的底层数据结构是红黑...

    HashSet和TreeSet.doc

    另一方面,TreeSet 是 SortedSet 接口的实现,它内部使用了红黑树(Red-Black Tree)数据结构,这使得 TreeSet 自动对元素进行了排序。排序依据可以是元素的自然顺序(即实现了 Comparable 接口的元素),也可以通过...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     6.1.2 从序列(Sequence)中获取自动增长的标识符 6.2 Java语言按内存地址区分不同的对象 6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  ...

    详解Java中HashSet和TreeSet的区别

    1. TreeSet 是二差树实现的,Treeset 中的数据是自动排好序的,不允许放入 null 值。 2. HashSet 是哈希表实现的,HashSet 中的数据是无序的,可以放入 null,但只能放入一个 null,两者中的值都不能重复,就如...

Global site tag (gtag.js) - Google Analytics