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

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...