180217_JAVA学习_TreeSet中存放含多个String的类并设置排序规则

Posted HYFH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了180217_JAVA学习_TreeSet中存放含多个String的类并设置排序规则相关的知识,希望对你有一定的参考价值。

有Person类如下:

1 class Person {
2   String name;
3   int age;
4   String address;
5 }

有main如下:

 1 import java.util.TreeSet;
 2 
 3 public class Test{
 4   public static void main(String[] args){
 5     Person p1 = new Person("AA",18,"CN");
 6     Person p2 = new Person("BB",18,"JP");
 7     Person p3 = new Person("CC",18,"CN");
 8 
 9     TreeSet<Person> persons = new TreeSet<>();
10     persons.add(p1);
11     persons.add(p2);
12     persons.add(p3);
13     for (Object person : persons) {
14       System.out.println(person);
15     }
16   }
17 }

由于TreeSet为可排序集合,所以要为存放对象(Person)指定排序规则。

排序规则:ASC(升序),age > address > name
故重写Person的compareTo():

 1 public int compareTo(Person o) {
 2     if(this.age > o.age){
 3         return 1;
 4     }else if(this.age < o.age) {
 5         return -1;
 6     }
 7     //判断age谁大,若相等,则判断address
 8     int x = this.address.compareTo(o.address);
 9     if(x != 0){
10         return x;
11     }
12     //判断address谁大,若相等,则判断name
13     return this.name.compareTo(o.name);
14 }

注:若要DESC排序:

  1、age比较中交换1/-1;
  2、address比较中return相反数值;
  3、name比较中return相反数值;

上述代码的逻辑顺序:
  传入比较对象o与自身进行对比;
    若this.age > o.age,返回“1”;
    若this.age < o.age,返回“-1”;
    若相等,比较address;
  令x = this.address.compareTo(o.address);
    若x != 0,即不相等,x即为要返回的值(1/-1);
    若x == 0,即相等,比较name;
  this.name.compareTo(o.name)的值即为要返回的值:
    若值为 1,即大于,
    若值为-1,即为小于,
    若值为 0,即三处均相等,则完全相等,不应存入。

 

完整代码:

 1 package toBKY;
 2 
 3 import java.util.TreeSet;
 4 
 5 public class Test{
 6     public static void main(String[] args){
 7         Person p1 = new Person("AA",18,"CN");
 8         Person p2 = new Person("BB",18,"JP");
 9         Person p3 = new Person("CC",18,"CN");
10 
11         TreeSet<Person> persons = new TreeSet<>();
12         persons.add(p1);
13         persons.add(p2);
14         persons.add(p3);
15 
16         for (Object person : persons) {
17             System.out.println(person);
18         }
19         //使用for each 比Iterator代码量少
20 
21     }
22 }
23 
24 class Person implements Comparable<Person>{
25     String name;
26     int age;
27     String address;
28 
29     public Person(String name, int age, String address) {
30         this.name = name;
31         this.age = age;
32         this.address = address;
33     }
34 
35     @Override
36     public String toString() {
37         return "Person{" +
38             "name=‘" + name + ‘\‘‘ +
39             ", age=" + age +
40             ", address=‘" + address + ‘\‘‘ +
41          ‘}‘;
42   }
43 
44   @Override
45   public int compareTo(Person o) {
46     if(this.age > o.age){
47       return 1;
48     }else if(this.age < o.age) {
49       return -1;
50     }
51     //判断age谁大,若相等,则判断address
52     int x = this.address.compareTo(o.address);
53     if(x != 0){
54       return x;
55     }
56     //判断address谁大,若相等,则判断name
57     return this.name.compareTo(o.name);
58   }
59 }

以上是关于180217_JAVA学习_TreeSet中存放含多个String的类并设置排序规则的主要内容,如果未能解决你的问题,请参考以下文章

java集合Set集合之TreeSet详解

java TreeSet能存放两个相同的元素吗?

JAVA集合03_HashSetLinkedHashSet概述TreeSet自然顺序比较器顺序

java中的treeSet中文排序

Java_集合框架SetHashSetLinkedHashSetTreeSet使用区别

32TreeSet简介