Java开发中TreeMap的排序方法compare改写(易错点总结)
程序员文章站
2022-07-10 18:46:49
要求分别使用默认方法和手动方法实现字符串和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
上一篇: unity使用字典动态查找和删除对象池
下一篇: 手写数据结构二叉堆