1. 程式人生 > >JAVA中TreeSet集合儲存類,類必須實現Compareble介面

JAVA中TreeSet集合儲存類,類必須實現Compareble介面

TreeSet是有序不可重複集,具有以下特點:
1、資料會按自然排序(可以理解為從小到大排序)
2、不可儲存null
3、資料不可重複
4、非執行緒安全

數字會從小到大進行排序—–例子:

package com.ckinghan.collectionDemo;

import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {

    /**
     * 
     * @描述:TreeSet集合的特點:
     *              1、資料會按自然排序(可以理解為從小到大排序)
     *              2、不可儲存null
     *              3、資料不可重複
     *              4、非執行緒安全
     * 
     * @時間:2017年5月9日22:41:41
     * @注意:
     * @作者:Ckinghan
     * @param
args */
public static void main(String[] args) { /** * 建立一個數字型別的treeSet有序不重複集並賦Integer型別的值 * 檢視集合的結果,會按從小到大的順序的排序 */ Set<Integer> set = new TreeSet<>(); set.add(1); set.add(9); set.add(4); set.add(2); set.add(5
); set.add(8); set.add(3); set.add(1); System.out.println(set); } } 執行結果: [1, 2, 3, 4, 5, 8, 9] 從結果上可以發現,數值“1”分明儲存了兩次,卻只能留存一個,這說明TreeSet不能儲存重複的值,並且結果是從小到大排序的

字串會將每個字元的ACIIS拿出來進行對比並排序—–例子:

package com.ckinghan.collectionDemo;

import java.util.Date;
import java.util.Set;
import
java.util.TreeSet; public class TreeSetDemo { /** * * @描述:TreeSet集合的特點: * 1、資料會按自然排序(可以理解為從小到大排序) * 2、不可儲存null * 3、資料不可重複 * 4、非執行緒安全 * * @時間:2017年5月9日22:41:41 * @注意: * @作者:Ckinghan * @param args */ public static void main(String[] args) { /** * 建立一個String型別的TreeSet集合 * 因為String實現了Comparable介面,所以可以在TreeSet集合儲存並排序 */ Set<String> set2 = new TreeSet<String>(); set2.add("wod"); set2.add("abe"); set2.add("abc"); System.out.println(set2); } } 執行結果: [abc, abe, wod] 可以看出,字串是按字母從小到大排序的。

對於程式設計師所寫的類,如果沒有實現Comparable介面,是無法放到treeSet集合中的,示例程式碼如下:

package com.ckinghan.collectionDemo;

import java.util.Date;

/**
 * @author:Ckinghan
 *  @date:2017年5月9日22:36:28
 *  @描述:測試實體類,用以實現Comparable介面,在treeSet集合中進行排序,本次程式碼沒有實現Comparable介面
 */
public class Enity {

    public Integer id;

    public String tableName;

    public Date createTime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Enity() {
        super();
    }

    public Enity(Integer id, String tableName, Date createTime) {
        super();
        this.id = id;
        this.tableName = tableName;
        this.createTime = createTime;
    }

}

測試程式碼如下:

package com.ckinghan.collectionDemo;

import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {

    /**
     * 
     * @描述:TreeSet集合的特點:
     *              1、資料會按自然排序(可以理解為從小到大排序)
     *              2、不可儲存null
     *              3、資料不可重複
     *              4、非執行緒安全
     * 
     * @時間:2017年5月9日22:41:41
     * @注意:
     * @作者:Ckinghan
     * @param args
     */
    public static void main(String[] args) {

        /**
         * 如果類沒有實現Comparable介面,是無法儲存在treeSet集合中的
         */
        Set<Enity> set3 = new TreeSet<>();
        set3.add(new Enity(1, "employeeInfo", new Date()));
        set3.add(new Enity(2, "employeeInfo", new Date()));
        set3.add(new Enity(3, "employeeInfo", new Date()));
        set3.add(new Enity(4, "employeeInfo", new Date()));
        set3.add(new Enity(1, "employeeInfo", new Date()));
        System.out.println(set3);

    }

}

執行結果如下 :

Exception in thread "main" java.lang.ClassCastException: com.ckinghan.collectionDemo.Enity cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1294)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at com.ckinghan.collectionDemo.TreeSetDemo.main(TreeSetDemo.java:55)

程式設計師自己定義 的類,要實現了Comparable介面後方可儲存到treeSet集合中,示例程式碼如下 :

package com.ckinghan.collectionDemo;

import java.util.Date;

/**
 * @author:Ckinghan
 *  @date:2017年5月9日22:36:28
 *  @描述:測試實體類,用以實現compareTo介面,在treeSet集合中進行排序
 */
public class Enity  implements Comparable<Enity>{

    public Integer id;

    @Override
    public String toString() {
        return "Enity [id=" + id + ", tableName=" + tableName + ", createTime=" + createTime + "]";
    }

    public String tableName;

    public Date createTime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Enity() {
        super();
    }

    public Enity(Integer id, String tableName, Date createTime) {
        super();
        this.id = id;
        this.tableName = tableName;
        this.createTime = createTime;
    }

    /**
     * 重寫compareTo方法,否則無法儲存到treeSet集合中
     */
    @Override
    public int compareTo(Enity o) {
        //對比是否this大於o
        int val = this.id - o.id;
        //如果兩者相同
        if(val == 0){
            //判斷tableName是否為空,如果不為空,則判斷兩者的tableName是否相等
            if(this.tableName != null ){
                //獲取對比的值 
                val = this.tableName.compareTo(o.tableName);
                //如果兩都的tableName相等,則判斷兩都的createTime是否相等
                if(val == 0){
                    //注意:這裡不建議使用getTime()再相減,因為如果時間相差過大,可能超過int的最大值,即使不大於int的最大值,最後還是要再強轉為int
                    val = this.createTime.compareTo(o.createTime);
                }
            }
        }
        return val;
    }

}


測試類程式碼:

package com.ckinghan.collectionDemo;

import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo {

    /**
     * 
     * @描述:TreeSet集合的特點:
     *              1、資料會按自然排序(可以理解為從小到大排序)
     *              2、不可儲存null
     *              3、資料不可重複
     *              4、非執行緒安全
     * 
     * @時間:2017年5月9日22:41:41
     * @注意:
     * @作者:Ckinghan
     * @param args
     */
    public static void main(String[] args) {

        /**
         * 如果類沒有實現compareTo介面,是無法儲存在treeSet集合中的
         */
        Set<Enity> set3 = new TreeSet<>();
        set3.add(new Enity(1, "employeeInfo", new Date()));
        set3.add(new Enity(2, "employeeInfo", new Date()));
        set3.add(new Enity(3, "employeeInfo", new Date()));
        set3.add(new Enity(4, "employeeInfo", new Date()));
        set3.add(new Enity(1, "employeeInfo", new Date()));

        /**
         * 迴圈列印set3集合中的內容
         */
        for(Enity enity : set3){
            System.out.println(enity);
        }

    }

}

執行結果:
Enity [id=1, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
Enity [id=2, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
Enity [id=3, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]
Enity [id=4, tableName=employeeInfo, createTime=Tue May 09 23:16:06 CST 2017]

注意:我添加了兩個ID為1的資料,結果卻出現了一個,應該是最終的返回值 為0影響的,但我也不敢肯定,因為在新增第一條資料時,返回的也是0。還需要再查詢資料才能確定。

找到了一篇文章 ,它說返加0時確實會做為是否重複的參考標準之一,但為什麼第一個新增的值返回的也是0,去可以新增呢?還要找相關的資料才行

相關推薦

JAVATreeSet集合儲存必須實現Compareble介面

TreeSet是有序不可重複集,具有以下特點: 1、資料會按自然排序(可以理解為從小到大排序) 2、不可儲存null 3、資料不可重複 4、非執行緒安全 數字會從小到大進行排序—–例子: package com.ckinghan.collecti

Java集合詳解結合 ArrayList、HashSet 的區別以及HashCode的作用。

Java中的集合:      (1)Collection                           List(有序,可重複)             ArrayList         

Java集合之ArrayListVector和Stack

這三個集合型別,其底層都是陣列實現的。討論集合關注的問題: 底層資料結構 增刪改查方式 初始容量,擴容方式,擴容時機 執行緒安全與否 是否允許空,是否允許重複,是否有序 ArrayList ArrayList是

java集合儲存結構

    Collection是最基本的集合介面,一個Collection代表一組Object的集合,這些Object被稱作Collection的元素。     所有實現Collection介面的類都必須提供兩個標準的建構函式:無引數的建構函式用於建立一個空的Collection,有一個Collectio

java三大集合MapSetList的詳細介紹

在講Map,Set,List三大介面之前,我們先來了解下Set和List的父類介面Collection介面 一:Collection介面:是java.util包下的一個介面: 其中有一些主要的方法: size(); isEmpty(); clear(); c

JavaTreeSet集合儲存自定義物件學生按照學生的年齡進行排序。

Set:無序,不可以重複元素。|--HashSet:資料結構是雜湊表。執行緒是非同步的。保證元素唯一性的原理:判斷元素的hashCode值是否相同。如果相同,還會繼續判斷元素的equals方法,是否為true。|--TreeSet:可以對Set集合中的元素進行排序。底層資料

java的幾種泛型——HashSet、HashMap、TreeSet、TreeMap遍歷map排序HashTable比較

package test; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; public c

java使用sax解析xml以實體集合的方式接受xml解析的值

1.先編寫要解析的xml檔案: <?xml version="1.0" encoding="utf-8"?> <class> <stu id="001"> <name>Allen</name> <sex&g

java 關於集合的整理02

cto 對象 arr 數組 bsp 有一個 只有一個 集合 java 四. 具體的集合 2. ArrayList 數組列表 註: ArrayList類 與 Vector類 有什麽區別呢? 答:Vector類的所有方法都是同步的,所以說Vector類是線程安全的,所以兩個線程

獲取java當前運行代碼行號方法名

我們 class new t static get new rac 加密 web 最近項目在線上出現一個報加密控件輸入為空的bug,由於IOS,Android,web端都報,但是沒找到原因,因為是偶現,所以為了捕捉這個問題,做出要我們把報錯信息傳給後臺,所以就寫一下獲取的方

Java開發知識之Java集合上List接口以及子講解.

必須 元素 範圍 指向 指定 pub next 自己 什麽             Java開發知識之Java中的集合類 一丶什麽是集合類   如果你學習說數據結構,那麽學習集合就很簡單. 因為集合就是存儲數據的結構. 例如 有鏈表結構 (list ) 還有 map結構.等

Java開發知識之Java集合上List介面以及子講解.

            Java開發知識之Java中的集合類 一丶什麼是集合類   如果你學習說資料結構,那麼學習集合就很簡單. 因為集合就是儲存資料的結構. 例如 有連結串列結構 (list ) 還有 map結構.等等.  集合類就是儲存資料的集合. 我們可以看一下繼承圖:    Co

java無法找到主方法無法找到web應用第一次報500第二次報404

在重灌機器後,原來的許多java工程在重新被新安裝的Eclipse讀取過程中出現了java.lang.NoNoClassDefFoundError的問題,檢視工程目錄中bin路徑下沒有生成對應的.class文件網上查閱了很多資料,大部分都指示classpath設定不對。但是Eclipse本身並不需要配置cla

Java基本資料型別與包裝字串轉換

儲存範圍大小: byte-short-char-int-long-float-double 低階到高階自動型別轉換: int i = 5; float f = i; double d = i; 高階到低階強制型別轉換: int a = 20; byte b = (byte) a;

Java(1) Java如何使封裝自己的建立並使用自己的庫?

Java中如何使封裝自己的類,建立並使用自己的類庫?            ——感謝您的閱讀,本篇文章轉載自以下連結,支援原創,人人有責。 http://blog.csdn.net/luoweifu/ar

JavaMap集合及其子

Collection集合的特點是每次進行單個物件的儲存,如果現在要進行一對物件的儲存,就只能用Map集合來完成,即Map集合中會一次性儲存兩個物件,且這兩個物件的關係:key = value結構。這種結構的最大特點是可以通過key找到對應的value內容。1.Map介面Map

集合 Java集合解析和一些有深入的面試題

第一題:       現有的程式程式碼模擬產生了16個日誌物件,並且需要執行16秒才能列印完這些日誌,請在程式中增加4個執行緒去呼叫parseLog()方法來分頭列印       這16個日誌物件,程式只需要執行4秒即可列印完這些日誌物件。 原始程式碼: pub

Java如何使封裝自己的建立並使用自己的庫?

Java中如何使封裝自己的類,建立並使用自己的類庫? 該文轉載SmilingSunrise的文章:http://blog.csdn.net/luoweifu/article/details/7281494 一、先來明白一下關於classpath和path的概念 p

java常見集合的遍歷

一、前言   我們經常在工作當中使用到集合,java當中的集合類較多,且自帶有豐富方法可對集合中的元素進行靈活操作,我們在使用時不必考慮資料結構和演算法實現細節,只需建立集合物件直接使用即可,這給我們帶來了極大的便利。本文對日常工作中常用的集合遍歷問題進行簡單

javaTreeSetadd時去重問題(與自己定義的Comparator有直接關係)

這個是我在百度問答裡面問的一個問題(直接copy過來的) 向TreeSet新增p1到p5後,輸出發現p5沒有加進去... 按我的理解來說,p5與p2雖然score屬性值一樣,但是它們是不同的物件,應該可以新增到TreeSet中啊 ------Person沒有重寫equa