Java集合2

Java集合2

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:

作者:陈剑波

撰写时间:2019年06月09日

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Comparable和Comparator

一、Comparable简介

   Comparable是排序接口。如果一个类实现了Comparable接口,就意味着这个类支持排序。实现Comparable接口的的类的对象的列表或数组可以通过Collections.sort或Array.sort进行自动排序。

   实现Comparable接口的对象可以用作有序映射中的键或有序集合中的集合,无需指 定比较器。

   Comparable接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小 于、等于或大于指定对象,则分别返回负整数、零或正整数。

示例代码:

/**

 * @author KO.ZERO

 *实现接口Comparable<T>

 *Comparable是一个内比较器,实现了Comparable接口的类有一个特点,

 *就是这些类是可以和自己比较,至于具体和另一个实现了Comparable接口的类如何比较,

 *则依赖compareTo方法的实现,compareTo方法被称为自然比较方法。如果开发者add进入

 *一个Collection的对象想要Collectionssort方法帮你自动进行排序的话,那么这个对象

 *必须实现Comparable接口。

 */

public class UniversityGradeComparable implements Comparable<UniversityGradeComparable> {

    private int ClassAndGrade;//班级

    private String StudentName;//学生姓名

   

    public UniversityGradeComparable() {

       

    }

    public UniversityGradeComparable(int classAndGrade, String studentName) {

        ClassAndGrade = classAndGrade;

        StudentName = studentName;

    }

   

    public int getClassAndGrade() {

        return ClassAndGrade;

    }

    public void setClassAndGrade(int classAndGrade) {

        ClassAndGrade = classAndGrade;

    }

    public String getStudentName() {

        return StudentName;

    }

    public void setStudentName(String studentName) {

        StudentName = studentName;

    }

    /**

     * @param o

     * @return

     * 实现compareTo方法

     * campareTo(UniversityGradeComparable o);

     *返回值: int  返回 0(两者相等),负数(对象小于参数),正数 (对象大于参数)

     *参数:   o 为要比较的对象

     */

    @Override

    public int compareTo(UniversityGradeComparable o) {

        // TODO Auto-generated method stub

        if (this.ClassAndGrade != o.ClassAndGrade) {//先根据班级排序,如果同班级则根据学生姓名排序。

            return this.ClassAndGrade - o.ClassAndGrade;

        } else {

            return this.StudentName.compareTo(o.StudentName);

        }

    }

}

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Iterator;

import java.util.List;

 

public class ListUniversityGradeComparable {

    public static void main(String[] args) {

        UniversityGradeComparable[] un = new UniversityGradeComparable[] {

                new UniversityGradeComparable(1704, "asf"),

                new UniversityGradeComparable(1703, "dsf"),

                new UniversityGradeComparable(1703, "fr"),

                new UniversityGradeComparable(1702, "asdf"),

                new UniversityGradeComparable(1704, "jyt"),

                new UniversityGradeComparable(1701, "ny"),

                new UniversityGradeComparable(1703, "po"),

                new UniversityGradeComparable(1704, "ve"),

                new UniversityGradeComparable(1703, "xq")

 

        };

        // Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。

        Arrays.sort(un);

        // foreach循环遍历输出结果

        for (UniversityGradeComparable universityGradeComparable : un) {

            System.out.print(universityGradeComparable.getClassAndGrade() + ""

                    + universityGradeComparable.getStudentName() + "|");

        }

        System.out.println("\n"+"-----------------");

 

        List<UniversityGradeComparable> universityGradeComparables = new ArrayList<UniversityGradeComparable>();

 

        universityGradeComparables.add(new UniversityGradeComparable(1701,

                "DSSSF"));

        universityGradeComparables.add(new UniversityGradeComparable(1701,

                "ASRGR"));

        universityGradeComparables.add(new UniversityGradeComparable(1704,

                "ASG"));

        universityGradeComparables

                .add(new UniversityGradeComparable(1702, "HT"));

        universityGradeComparables.add(new UniversityGradeComparable(1704,

                "THN"));

        universityGradeComparables

                .add(new UniversityGradeComparable(1703, "TH"));

        universityGradeComparables

                .add(new UniversityGradeComparable(1703, "RH"));

        universityGradeComparables.add(new UniversityGradeComparable(1702,

                "RVB"));

        universityGradeComparables.add(new UniversityGradeComparable(1704,

                "IOHG"));

        universityGradeComparables.add(new UniversityGradeComparable(1703,

                "MJIUY"));

        // Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。

        Collections.sort(universityGradeComparables);

        // foreach循环

        // for (UniversityGradeComparable universityGradeComparable :

        // universityGradeComparables) {

        // System.out.println(universityGradeComparable.getClassAndGrade()

        // + "\t" + universityGradeComparable.getStudentName());

        // }

        // While循环使用迭代器遍历输出列表数据

        // Iterator<UniversityGradeComparable> iterator =

        // universityGradeComparables

        // .iterator();

        // while (iterator.hasNext()) {

        // UniversityGradeComparable universityGradeComparable =

        // (UniversityGradeComparable) iterator

        // .next();

        // System.out.println(universityGradeComparable.getClassAndGrade()

        // + "\t" + universityGradeComparable.getStudentName());

        // }

        // for循环使用迭代器遍历输出列表数据

        for (Iterator<UniversityGradeComparable> iterator2 = universityGradeComparables

                .iterator(); iterator2.hasNext();) {// hasNext():判断是否有元素可以迭代,有则返回

                                                    // true

            // iterator():返回在此 collection 的元素上进行迭代的迭代器。

            UniversityGradeComparable universityGradeComparable = iterator2

                    .next();// next():返回迭代的下一个元素。

            System.out.print(universityGradeComparable.getClassAndGrade()

                    + "" + universityGradeComparable.getStudentName() + "|");

        }

    }

}

运行结果:

1701ny|1702asdf|1703dsf|1703fr|1703po|1703xq|1704asf|1704jyt|1704ve|

-----------------

1701ASRGR|1701DSSSF|1702HT|1702RVB|1703MJIUY|1703RH|1703TH|1704ASG|1704IOHG|1704THN|

 

二、Comparator简介

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排 序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排 序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现 Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

注意:

  1. 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但 可以不实现 equals(Object obj) 函数。
  2. int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2 小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

示例代码:

import java.util.Comparator;

 

/**

 * @author KO.ZERO

 *实现接口Comparator<T>

 *Comparator是一个外比较器,实现Comparator接口的方式有两种:

 *1、没有实现Comparable接口,但又想比较两个对象。

 *2、实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。

 *Comparator接口里面有一个compare方法,方法有两个参数T o1T o2,是泛型的表示方式,分别表示待比较的两个对象

 *比较o1o2的大小。返回负数,意味着“o1o2 ;返回,意味着“o1等于o2”;返回正数,意味着“o1大于o2”

 */

public class UniversityGradeComparator implements Comparator<UniversityGradeComparator> {

    private int ClassAndGrade;// 班级

    private String StudentName;// 学生姓名

    public UniversityGradeComparator() {

       

    }

    public UniversityGradeComparator(int classAndGrade, String studentName) {

        ClassAndGrade = classAndGrade;

        StudentName = studentName;

    }

    public int getClassAndGrade() {

        return ClassAndGrade;

    }

    public void setClassAndGrade(int classAndGrade) {

        ClassAndGrade = classAndGrade;

    }

    public String getStudentName() {

        return StudentName;

    }

    public void setStudentName(String studentName) {

        StudentName = studentName;

    }

    /**

     * @param o1

     * @param o2

     * @return

     * 实现compare方法

     * int compare(UniversityGradeComparator o1,UniversityGradeComparator o2)

     * 返回值: int  返回 0(两者相等),负数(对象小于参数),正数 (对象大于参数)

     * 参数:   o1 o2为要比较的两个对象

     */

    @Override

    public int compare(UniversityGradeComparator o1,

            UniversityGradeComparator o2) {

        //先根据班级排序,如果同班级则根据学生姓名排序。

        if (o1.getClassAndGrade() != o2.getClassAndGrade()) {

            return o1.getClassAndGrade()

                    - o2.getClassAndGrade();

        } else {

            return o2.getStudentName().compareTo(

                    o1.getStudentName());

        }

    }

}

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.Iterator;

import java.util.List;

 

public class ListUniversityGradeComparator {

    public static void main(String[] args) {

        UniversityGradeComparator[] un=new UniversityGradeComparator[]{

                  new UniversityGradeComparator(1704, "克鲁德"),

                  new UniversityGradeComparator(1701, "弗利沙"),

                  new UniversityGradeComparator(1704, "巴拉卡斯"),

                  new UniversityGradeComparator(1703, "达尔"),

                  new UniversityGradeComparator(1703, "布罗利"),

                  new UniversityGradeComparator(1701, "卡卡罗特"),

                  new UniversityGradeComparator(1704, "巴达克"),

                  new UniversityGradeComparator(1704, "姬内"),

                  new UniversityGradeComparator(1702, "拉迪兹")

          };

        // Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。

        Arrays.sort(un,new UniversityGradeComparator());

        // foreach循环遍历输出结果

        for (UniversityGradeComparator universityGradeComparator : un) {

            System.out.print(universityGradeComparator.getClassAndGrade()

                    + "" + universityGradeComparator.getStudentName()+"|");

        }

        System.out.println("\n"+"--------------");

       

        List<UniversityGradeComparator> universityGradeComparators = new ArrayList<UniversityGradeComparator>();

 

        universityGradeComparators.add(new UniversityGradeComparator(1701,

                "向日葵"));

        universityGradeComparators.add(new UniversityGradeComparator(1704,

                "沙罗妲"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1704, "巳月"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1702, "鹿台"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1701, "蝶蝶"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1703, "佐井"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1703, "鸣人"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1702, "佐助"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1704, "小樱"));

        universityGradeComparators

                .add(new UniversityGradeComparator(1703, "羽衣"));

       

        // Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。

        Collections.sort(universityGradeComparators,

                /**

                 * @author KO.ZERO

                 * 创建Comparator比较器,在Comparator比较器中

                 *重写int compare(UniversityGradeComparator o1, UniversityGradeComparator o2) 如果遇到数字的比较,

                 *直接在方法内返回两个对象的属性的差值,例如return o1.getClassAndGrade() - o2.getClassAndGrade();

                 *是升序,return o2.getClassAndGrade() - o1.getClassAndGrade(); 是降序;如果遇到字符形式的比较利用

                 *compareTo(T o) 方法进行比较,该方法比较从头开始每一个字符,当前者大于后

                 *者返回1,当前者小于后者返回-1

                 */

                new Comparator<UniversityGradeComparator>() {

 

                    @Override

                    public int compare(UniversityGradeComparator o1,

                            UniversityGradeComparator o2) {

                        // TODO Auto-generated method stub

                        if (o1.getClassAndGrade() != o2.getClassAndGrade()) {

                            return o1.getClassAndGrade()

                                    - o2.getClassAndGrade();

                        } else {

                            return o2.getStudentName().compareTo(

                                    o1.getStudentName());

                        }

                    }

                });

        Iterator<UniversityGradeComparator> iterator = universityGradeComparators.iterator();

//      iterator():返回在此 collection 的元素上进行迭代的迭代器。

        while (iterator.hasNext()) {//hasNext():如果仍有元素可以迭代,则返回 true

            UniversityGradeComparator universityGradeComparator = (UniversityGradeComparator) iterator

                    .next();//next():返回迭代的下一个元素。

            System.out.print(universityGradeComparator.getClassAndGrade()

                    + "" + universityGradeComparator.getStudentName()+"|");

        }

    }

}

运行结果:

1701:弗利沙|1701:卡卡罗特|1702:拉迪兹|1703:达尔|1703:布罗利|1704:巴达克|1704:巴拉卡斯|1704:姬内|1704:克鲁德|

--------------

1701:蝶蝶|1701:向日葵|1702:鹿台|1702:佐助|1703:鸣人|1703:羽衣|1703:佐井|1704:沙罗妲|1704:巳月|1704:小樱|

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值