zoukankan      html  css  js  c++  java
  • Java集合框架之Set接口

     1.Set接口不记录元素添加顺序的误区

    public  void setDemo(){
            Set<String> set1 = new HashSet<>();
            set1.add("London");
            set1.add("Chinese");
            set1.add("Shanghai");
            set1.add("England");
            set1.add("China");
         System.out.println(set1);

       }

    输出结果为:[Shanghai, China, London, England, Chinese]

    hashset 没有顺序的意思是实际上的顺序和插入顺序不一样。
    比如,按照set.add(1);set.add(2);set.add(3);插入
    输出顺序却可能是231
    而不是说随机输出顺序。

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

    2.Java,子类不是必须重写父类所有方法的,分为以下两种情况:

    1.父类方法为抽象方法时,子类必须重写(实现)所有父类的抽象方法;

     2.父类方法为普通方法时,子类可以重写父类方法,也可以不重写。

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

    3.TreeSet需要重写CompareTo方法 默认情况下进行自然排序。

     1 //用年龄进行排序
     2 class Person implements Comparable<Person> {
     3      String name;
     4      int age;
     5 
     6     public Person(String name, int age) {
     7         this.name = name;
     8         this.age = age;
     9     }
    10 
    11     @Override
    12     public int compareTo(Person o) {
    13         if (this.age > o.age) {
    14             return 1;
    15         } else if (this.age < o.age) {
    16             return -1;
    17         }
    18         return 0;
    19     }
    20 
    21     @Override
    22     public String toString() {
    23         return "Person [name=" + name + ", age=" + age + "]";
    24     }
    25     
    26 }
    27 
    28 public class TreeSetDemo {
    29     public static void main(String[] args) {
    30         Set<Person> tree = new TreeSet<>();
    31         tree.add(new Person("李白", 15));
    32         tree.add(new Person("赵云", 17));
    33         tree.add(new Person("关羽", 2));
    34         tree.add(new Person("张飞", 16));
    35         System.out.println(tree);

    想了两天都没搞懂compareTo方法中形参Person o是哪里来的,下面的是我的猜想:

    this指代当前对象,第一次插入时,成员变量 name和age分别被赋值为:李白和15,这时候this是指刚插入的李白,然而此时Person o对象不存在,所以不进行比较。

    第二次插入"赵云"时,this指代赵云,o指代第一次插入的李白,以此类推,TreeSet会自动调用compareTo方法。

    TreeSet会自动调用compareTo方法进行排序


     

    自定义排序:(实现Comparator接口)(根据姓名的长度进行排序)

     1 class NameLengthComparator implements Comparator<Person> {
     2 
     3     @Override
     4     public int compare(Person o1, Person o2) {
     5         if(o1.name.length() > o2.name.length()) {
     6             return 1;
     7         }else if(o1.name.length() < o2.name.length()) {
     8             return -1;
     9         }
    10         return 0;//返回0 两个对象指同一个对象
    11     }
    12     
    13 }
    14 public class TreeSetDemo {
    15     public static void main(String[] args) {
    16 
    17         Set<Person> tree2 = new TreeSet<>(new NameLengthComparator());
    18         tree2.add(new Person("李白123", 15));
    19         tree2.add(new Person("赵云1", 17));
    20         tree2.add(new Person("关羽", 2));
    21         tree2.add(new Person("张飞252727", 16));
    22         System.out.println(tree2);
    23 
    24     }
    25 }
  • 相关阅读:
    attempt to write a readonly database错误的解决(C#,SQLite) ..
    .net中正则表达式的客户端验证javascript
    WinForm : 利用webBrowser完成填充数据并 自动登陆某网站。。。。。。。
    获取一个网页数据返回的编码类型是gzip,解压后,网页中包含的中文字段变成了乱码,只需要把编码更改为BIG5 ,繁体字就正常显示了!
    将 windows程序(exe程序)运行为windows服务 !!!
    Asp.Net2.0 如何设置 GridView 合并行或列?
    奖金不兑现,我该怎么办?
    GridView二层表头与三层表头的设计。。。。。。。。。。。。。。。。。。。。。。。。
    C# 一个多线程操作控件的例子.#######
    SQL SERVER 2000 中的标识值获取函数 !!!!
  • 原文地址:https://www.cnblogs.com/AmosWong/p/9569305.html
Copyright © 2011-2022 走看看