集合中元素大小的可排序問題

来源:http://www.cnblogs.com/letben/archive/2016/02/06/5184014.html
-Advertisement-
Play Games

package CollectionPart; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CollectionSort { public static v


package CollectionPart;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionSort {
    
    public static void main(String[] args) {
        
        List myList = new ArrayList();
        myList.add("3");
        myList.add("1");
        myList.add("5");
        myList.add("sdf");
        myList.add("fwef");
        Collections.sort(myList);
        for (Object object : myList) {
            System.out.println(object);
        }
        //這樣,集合就幫助我們進行了排序的操作。
        
        System.out.println("------------");
        
        //依然是,之前遇到的那個問題。如果不再是字元串或者基本數據類型,如果是我們自己定義的一個實體對象類型,那麼如何比較兩個元素的大小呢?
        //剛剛有寫過一個 員工2類,那裡面重寫了equals() 和hashCode() 方法,那不妨試試員工2類。
        Employee_3 e1 = new Employee_3("1","lifei",23,"2016-06-03");
        Employee_3 e2 = new Employee_3("2","lifei2",24,"2016-06-03");
        Employee_3 e3 = new Employee_3("3","lifei3",25,"2016-06-03");
        
        List<Employee_3> myList2 = new ArrayList();
        myList2.add(e3);
        myList2.add(e1);
        myList2.add(e2);
        Collections.sort(myList2);
        for (Employee_3 employee_2 : myList2) {
            System.out.println(employee_2);
        }
        System.out.println("從輸出結果上很容易看出來,是按照我們添加的順序輸出的,事實上我們也沒有進行排序.從結果上看原來的員工2類,改成了現在的3.這是因為,在寫sort的時候,就不允許了,這是因為編譯器,在編譯過程中發現,當前類也就是 employee_2中並不具有比較器。");
        /**
         * 所以,如果想要對一個我們自己實現的對象進行排序的話,必須要讓被排序的實體擁有一個比較器。也就是說對於我們所寫的實體如果讓他符合set集合的話,需要告訴編譯器到底什麼相等,兩個實體才算相等,為了讓相同類型的元素進行排序,我們需要指定怎麼樣才算是大,怎麼樣才算是小。
         * 這樣就需要一個,比較器,有兩種實現形式,方式1:讓實體類實現comparable 介面。
         * 同是為了排序,如果實體類已經不可更改,或者 最好不用去觸碰原來的代碼,那麼重寫一個,比較器類也是不錯的選擇。
         */
        Collections.sort(myList2,new MyComparator());
        for (Employee_3 employee_3 : myList2) {
            System.out.println(employee_3);
        }
    }
}

員工3類:

package CollectionPart;

/**
 * 實現了  comparable介面
 * @param <T>
 * 
 */
public class Employee_3 implements Comparable<Employee_3> {
    
    private String employeeId;
    private String employeeName;
    private int employeeAge;
    private String employeeHireDate;
    /*
    這裡就存儲成String 類型,在 資料庫裡面設置成 date格式。
    然後 利用Date today = new Date();
    SimpleDateFormat fm = new SimpleDateFormat("YYYY-MM-dd");
    來做
    */
    public String getEmployeeId() {
        return employeeId;
    }
    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }
    public String getEmployeeName() {
        return employeeName;
    }
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }
    public int getEmployeeAge() {
        return employeeAge;
    }
    public void setEmployeeAge(int employeeAge) {
        this.employeeAge = employeeAge;
    }
    public String getEmployeeHireDate() {
        return employeeHireDate;
    }
    public void setEmployeeHireDate(String employeeHireDate) {
        this.employeeHireDate = employeeHireDate;
    }
    @Override
    public String toString() {
        return "Employee_1 [employeeId=" + employeeId + ", employeeName=" + employeeName + ", employeeAge="
                + employeeAge + ", employeeHireDate=" + employeeHireDate + "]";
    }
    public Employee_3(String employeeId, String employeeName, int employeeAge, String employeeHireDate) {
        super();
        this.employeeId = employeeId;
        this.employeeName = employeeName;
        this.employeeAge = employeeAge;
        this.employeeHireDate = employeeHireDate;
    }
    public Employee_3() {
        super();
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + employeeAge;
        result = prime * result + ((employeeHireDate == null) ? 0 : employeeHireDate.hashCode());
        result = prime * result + ((employeeId == null) ? 0 : employeeId.hashCode());
        result = prime * result + ((employeeName == null) ? 0 : employeeName.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee_3 other = (Employee_3) obj;
        if (employeeAge != other.employeeAge)
            return false;
        if (employeeHireDate == null) {
            if (other.employeeHireDate != null)
                return false;
        } else if (!employeeHireDate.equals(other.employeeHireDate))
            return false;
        if (employeeId == null) {
            if (other.employeeId != null)
                return false;
        } else if (!employeeId.equals(other.employeeId))
            return false;
        if (employeeName == null) {
            if (other.employeeName != null)
                return false;
        } else if (!employeeName.equals(other.employeeName))
            return false;
        return true;
    }
    @Override
    public int compareTo(Employee_3 o) {
        return this.getEmployeeAge()-o.getEmployeeAge();
    }
}

比較器:

package CollectionPart;

import java.util.Comparator;

public class MyComparator implements Comparator<Employee_3> {

    @Override
    public int compare(Employee_3 o1, Employee_3 o2) {
        return o2.getEmployeeAge()-o1.getEmployeeAge();
    }

}

 

運行結果:

1
3
5
fwef
sdf
------------
Employee_1 [employeeId=1, employeeName=lifei, employeeAge=23, employeeHireDate=2016-06-03]
Employee_1 [employeeId=2, employeeName=lifei2, employeeAge=24, employeeHireDate=2016-06-03]
Employee_1 [employeeId=3, employeeName=lifei3, employeeAge=25, employeeHireDate=2016-06-03]
從輸出結果上很容易看出來,是按照我們添加的順序輸出的,事實上我們也沒有進行排序.從結果上看原來的員工2類,改成了現在的3.這是因為,在寫sort的時候,就不允許了,這是因為編譯器,在編譯過程中發現,當前類也就是 employee_2中並不具有比較器。
Employee_1 [employeeId=3, employeeName=lifei3, employeeAge=25, employeeHireDate=2016-06-03]
Employee_1 [employeeId=2, employeeName=lifei2, employeeAge=24, employeeHireDate=2016-06-03]
Employee_1 [employeeId=1, employeeName=lifei, employeeAge=23, employeeHireDate=2016-06-03]

 

都到了這裡了,發現泛型問題不可迴避。

我們發現在第一個輸出結果裡面,既可以存放數字也可以存放字元串兒,這是由於java在封裝的時候為我們提供了便利,希望我們可以存儲任何類型的數據到集合中,但是這就會帶來一定的弊端,比如這個集合裡面什麼都可以放的話,對於我們針對某些特定的元素就會出現問題。比如我們要是只能向集合中添加數字,那麼存取的時候都知道這裡是數字,並且方便易用。但是因為沒有加限定條件,導致了數字的集合裡面放入了別的元素。這樣存取和使用都會出現問題,就好像我有很多台蘋果手機,然後有人跟我買,我開始都掏出手機給對方,但是由於沒有加約束,導致了工人在存放數據的時候,放入了可以食用的蘋果,這個時候我在取的時候拿給買家一個可以食用的蘋果,而別人給我了幾千塊錢是想買一部手機,這就會出問題。人家可能會打我。這就是在存放的時候,沒有加約束的結果,如果往倉庫的存儲過程中,限定了只能放入手機,而不是水果,那麼加入了<Mobile>這個 泛型,那存的時候就一定都是手機了,我在向外取的時候,就只會給客戶蘋果手機,這樣。就是一個合理的過程了。

 

比較能理解介面泛型,和方法泛型,至於類上面的泛型完全可以通過 參數傳過來,沒想好。這個 常式做的也比較奇怪,希望可以一起討論。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Niginx主配置文件參數詳解 a.上面博客說了在Linux中安裝nginx。博文地址為:http://www.cnblogs.com/hanyinglong/p/5102141.html b.當Nginx安裝完畢後,會有相應的安裝目錄,安裝目錄里的nginx.confg為nginx的主配置文件
  • 前段時間,項目中有個需求,需要將linux和windows的時間進行同步,網上也有很多類似時鐘同步的帖子,大致類似;不過本次的linux的機器有點特殊,沒有service命令,而且要求在另一臺suse的linux機器上通過腳本連接到目的linux機器進行時鐘同步。起先我也被困擾的很久,不過辦法都是人
  • 類的繼承,是在父類中存在可繼承的成員A,而在子類中不存在同名成員,這樣該成員會被繼承到子類,當子類對象訪問該成員時,實際訪問的是父類的對應成員。類的重寫,是在父類中存在可繼承的成員A,而在子類中存在同名成員,這樣該成員會被子類重寫,當子類對象訪問該成員時,實際訪問的是子類的成員。所以二者的區別就是,
  • 在節前的最後一天,解決了打包過程中遇到的所有問題,可以成功運行了!真是個好彩頭,希望新的一年一切順利! 以下是在使用cx_freeze過程中遇到的問題及解決辦法(Win7) 問題描述:運行exe,啟動無數個主程式,導致系統無法使用 原因:在程式中使用了multiprocessing的包 解決辦法:在
  • package CommonClassPart; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Common
  • /*漢諾塔的玩法: * 游戲的規則:將A柱上的盤子移動到C柱上,大盤必須在小盤之上。 * 1 當A柱上只有一個盤子的時候,直接移動到C柱上; * 2 當A柱上有兩個盤子的時候, * 將A柱上的1盤(從上到下編號)移動到B柱, * 將A柱上的2盤移動到C柱, * 將B柱上的1盤移動到C柱; * (將A
  • 本文實例講述了PHP限制HTML內容中圖片必須是本站的方法。分享給大家供大家參考。具體實現方法如下: 1. PHP代碼如下: <?php $dom = new DOMDocument; $dom->loadHTML(file_get_contents('input.html')); $xpath =
  • java magic翻譯系列文章,java小伙伴不知道的奇妙世界
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...