欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java开发中TreeMap的排序方法compare改写(易错点总结)

程序员文章站 2022-03-26 16:46:05
要求分别使用默认方法和手动方法实现字符串和Person对象的排序去重1.TreeMap存储字符串2.TreeMap存储Person对象代码仔细看一下吧写的比较乱import java.util.Comparator;import java.util.TreeMap;public class Test2 { public static void main(String[] args) { /* 改变排序器,同时将排序器的名字写在TreeMap的小括号...
要求

分别使用默认方法和手动方法实现字符串和Person对象的排序去重
1.TreeMap存储字符串
2.TreeMap存储Person对象

代码

仔细看一下吧
写的比较乱

import java.util.Comparator;
import java.util.TreeMap;

public class Test2 {
    public static void main(String[] args) {
        /*
        改变排序器,同时将排序器的名字写在TreeMap的小括号里
        注意排序器的Object类是什么类型,如果在实现类中定义了就要写上
        Comparator是一个接口
         */
        /*对String的TreeMap的排序
        TreeMap<String ,String> treeMap=new TreeMap<String,String>(new Manualcomparator());
        treeMap.put("jav","完全面向对象");
        treeMap.put("python","人生苦短,我用python");
        treeMap.put("html","呈现一切");
        System.out.println(treeMap);
         */
        /*
        //使用自带的排序器
        TreeMap<String,String> treeMap1=new TreeMap<>();
        treeMap1.put("java","完全面向对象");
        treeMap1.put("python","人生苦短,我用python");
        treeMap1.put("html","呈现一切");
        System.out.println(treeMap1);
         */

        /*对自写类的排序,按照key的长度、字典序列排
        TreeMap<Person,Person> treeMap2=new TreeMap<Person,Person>(new Manualcomparator1());
        treeMap2.put(new Person("java",1),new Person("python",2));
        treeMap2.put(new Person("html",3),new Person("iso",4));
        treeMap2.put(new Person("htmlg",5),new Person("dso",6));
        treeMap2.put(new Person("htm",7),new Person("lso",8));
        System.out.println(treeMap2);
        */
        /**
         * 再次犯错,Manualcompartor没有new,这是一个类,使用时一定要创建
         * TreeMap尖括号里的k、v只能是类,不可以是基本类型
         */
        TreeMap<String,Integer> treeMap3=new TreeMap<String,Integer>(new Manualcomparator2());
        treeMap3.put(new Person("java",1).name,new Person("java",1).age);
        treeMap3.put(new Person("iso",1).name,new Person("iso",1).age);
        treeMap3.put(new Person("bigdata",1).name,new Person("bigdat",1).age);
        treeMap3.put(new Person("html",1).name,new Person("html",1).age);
        System.out.println(treeMap3);
     }

    @Override
    public String toString() {
        return super.toString();
    }
}

/**
 * 要想在main函数输出内容,而不是地址,就要在此地方改写toString()方法
 * 因为main输出的是Person类的内容,所以要规定Person的输出格式
 */
class Person{
    String name;
    int age;
    public Person(){}
    public Person(String name,int age){
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

/**
 * 修改排序器
 * 排序器的名字叫 compare
 * comparator是接口名,里面有两个方法compare、equals
 */
class Manualcomparator implements Comparator<String> {
    @Override
    public int compare(String o, String t1) {
        int n=o.length()-t1.length();
        return n==0?o.compareTo(t1):n;
    }
}

/**
 * 对类的comparator接口方法的重写
 * 错误点:
 * 1、异常要抛出
 * 2、异常是一个方法,要有括号
 * 3、equals返回的值是Object是super的父类的泛型,
 *    必须是Object不能直接给定类型
 */
class Manualcomparator1 implements Comparator<Person> {
    @Override
    public int compare(Person o,Person t1) {
        int n=o.name.length()-t1.name.length();
        return n==0?o.name.compareTo(t1.name):n;
    }
}

/**
 * 对comparator接口的重写
 * 犯错点:
 * comparator的参数只需要写一个,因为就能比较同类型的
 */
class Manualcomparator2 implements Comparator<String > {
    @Override
    public int compare(String o,String t1) {
        int n=o.length()-t1.length();
        return n==0?o.compareTo(t1):n;
    }
} 

代码是没有问题的,上面标记的都是本人在编写时犯的错误。
总结一下:
容易错误的点:
1、类、接口的使用要new
2、输出结果不理想(主要是输出的是地址值),那就再定义类中重写toString方法
3、compare的比较只需要输入一个参数
4、key、value的值类型只可以是类的类型,不可以是基本类型;只要记住只要是泛型就不能是基本类型就行
5、一个key只能对应一个value值;如果想要一个key对应多个value,那就将value改写成类

拓展一下:
Comparator<—>compare<–>自己创建的排序方法<–>使用时要在TreeMap后写上
Comparable<–>compareTo<–>默认排序方法<–>TreeMap不写时默认使用该方法
上面的方法都可以重写

本文地址:https://blog.csdn.net/zdryn/article/details/107875798

相关标签: Java TreeMap