当前位置: 移动技术网 > IT编程>开发语言>Java > Java开发中TreeMap的排序方法compare改写(易错点总结)

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

2020年08月10日  | 移动技术网IT编程  | 我要评论
要求分别使用默认方法和手动方法实现字符串和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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网