1. 程式人生 > >自定義物件去重(Set篇)

自定義物件去重(Set篇)

當需要給集合去重時,實現的方式有很多。這裡介紹使用Set去重(兩種方式)

需求:給多個Student物件去重

public class Student {
	private int id;
	private String name;
	public Student() {}
	public Student(int id,String name) {
		this.id=id;
		this.name=name;
	}
}

方式一:

public static void main(String[] args) {
		Comparator<Student> com=new Comparator<Student>() {
                    @Override
                    public int compare(Student o1, Student o2) {
                    return o1.getId().compareTo(o2.getId());//自定義條件,我這裡只是判斷id相等即為同一個物件
                    }
                };
                Set<Student> set = new TreeSet<Student>(com);
                set.add(new Student(1, "張三"));
		set.add(new Student(1, "李四"));
		set.add(new Student(1, "張三1"));
		System.out.println(set.size());
        
}

這裡我我只是判斷id相等幾位同一物件,所以即便name不同Set也會判斷三個物件相等。即只儲存了一個物件

執行結果:

說明:compareTo ()方法->返回0即為兩個物件相等

方式二:

拓展:HashSet底層時HashMap,當我滿開啟原始碼會發現當new一個HashSet時會預設new一個HashMap

我們一般使用HashMap時是這樣使用:

HashMap hashmap=new HashMap<String,Object>();

key是唯一的,String重寫了hashCode和equals方法,所以我們可以非常愉快的使用String物件作為key來使用

因為Set儲存的是不重複的物件,依據hashCode和equals進行判斷,所以可以重寫這兩個方法自定義Set的唯一策略

進入正題:

public class Student {
	private Integer id;
	private String name;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Student() {}
	public Student(int id,String name) {
		this.id=id;
		this.name=name;
	}
	@Override 
	public int hashCode() {
		// TODO Auto-generated method stub
		//return name.hashCode();
		return id;//如果沒有物件的唯一值,可使用 return  name.hashCode()
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		Student stu=(Student) obj;
		return this.id==stu.id;
	}
}

關於hashCode()說明:由於設定id是物件的唯一標識,所以只是返回id即可,當情況不同是可使用 name.hashCode();規則可靈活改動

執行結果:

相關推薦

定義物件Set

當需要給集合去重時,實現的方式有很多。這裡介紹使用Set去重(兩種方式) 需求:給多個Student物件去重 public class Student { private int id; private String name; public Student() {

【SpringBoot 基礎系列】實現一個定義配置載入器應用

![](https://spring.hhui.top/spring-blog/imgs/200507/logo.jpg) > [【SpringBoot 基礎系列】實現一個自定義配置載入器(應用篇)](https://mp.weixin.qq.com/s?__biz=MzU3MTAzNTMzMQ==&

MySQL定義排序

 MySQL表中有多個使用者,每個使用者有他的成績,一個使用者可能有多個不同的成績,    查詢結果成績由高到低排列,有多個成績的使用者,只取他的最高分。 [sql] view plain copy  print? select * fromus

redis 在 php 中的應用Set

之間 進行 group center 集合運算 返回 world cut 數據 上一篇:redis 在 php 中的應用(List篇) 本文為我閱讀了 redis參考手冊 之後編寫,註意 php_redis 和 redis-cli 的區別(主要是返回值類型和參數用法) Re

SpringMVC十二定義異常處理器 HandlerExceptionResolver接口

pin org ota admin pack property framework ase exception 自定義異常處理器和系統異常處理器的提升版可以實現相同的功能,但是使用的方法不同,自定義異常處理器可以不用在配置文件中配置name多東西,只需要一個異常處理器就可以

Odoo 定義Widgets 基礎教程章節1

大家好, 此次,我們主要講解 Odoo 中的Widgets。 網上、論壇裡很多提及Widget的文章,但很少說Odoo自定義Widget 是如何實現的,這一直是大家所苦惱的地方。本章,將對Odoo中的Widget 進行基礎講解。 首先, Widget【掛件】產生的目的,是為了方便後端開發人員在不熟悉Ja

定義輪播圖banner圖

public class MyBannerActivity extends AppCompatActivity { private String[] picUrl = { "https://img.huxiucdn.com/article/c

定義View繪製流程面試專用

(自己整理的比較亂,但這麼說沒問題的!) 自定義view是幹嘛的呢? 當我們不滿足於Android提供的原生控制元件和佈局時,就應該考慮到自定義view。 自定義View分為兩大塊。  自定義控制元件  和  自定義容器 自定義View必須重寫兩個構造方法  第一個

Java遇到需要去掉重複的問題怎麼辦

JAVA去重 去掉在List中物件屬性重複的物件 /** * 去重 * 需要去掉學生中分數相同的 */ //建立一個set Set set = new HashSet(); //記錄set的大小 int nowsize = set.size(); /

隨筆 定義redis快取註解基於springboot

前言:            最近專案開發中需要使用redis快取為資料庫降壓。由於在構建系統時沒有使用快取,後期加入快取的時候不想對業務程式碼上新增,造成程式碼入侵,所有封裝了一套自定義快取類,處理快取。 開發環境:          win10+Intelli

【Android】_定義Adapter_學生註冊無資料庫

本文是完善前一篇學生註冊文章(https://blog.csdn.net/cungudafa/article/details/84780652)中:對`自定義ListView`增加`介面卡Adapter`實現對每個學生個體進行再編輯和刪除操作。

spring-security 個性化用戶認證流程——定義登錄頁面可配置

ron 進行 狀態 row 錯誤 this 力度 override all 1.定義自己的登錄頁面我們需要根據自己的業務系統構建自己的登錄頁面以及登錄成功、失敗處理在spring security提供給我的登錄頁面中,只有用戶名、密碼框,而自帶的登錄成功頁面是空白頁面(可以

Android 定義view --圓形百分比進度條

注:本文由於是在學習過程中寫的,存在大量問題(overdraw onDraw new物件),請讀者們不要被誤導!!解決辦法見後面的部落格。 起因 最近公司專案有需求需要用到輕量級圖表如下

一步一步帶你實現定義圓形進度條詳解

        每次看到別人做出炫酷的都會想,這個應該很難吧?這是心理上先入為主的就這麼認為了,其實實現很簡單,下面一步一步的詳細剖析自定義圓形進度條的步驟。 首先看效果圖: 篇幅有點長,耐心看完肯定get新技能。 看每一個檢視都包含了些什麼。 最

java 實現陣列集合轉換

public static void main(String[] args) { int[] nums = { 5, 6, 6, 6, 8, 8, 7 }; List<Integer> numList = new ArrayList<Integer

Echarts定義資料檢視樣式表格樣式

用過echarts的同胞們都知道,自帶的資料檢視是怎樣的。在真正做專案時,肯定需要我們自己來寫一個相對美觀的資料檢視。下面以表格樣式的資料檢視為例,來實現一個自己的資料檢視。 <!DOCTYPE html> <html> <head>

Android:實際運用Zxing整合二維碼掃描 及 定義掃碼介面demo原始碼

二維碼掃描,各大主流App必不可少的功能,而且google已將輪子替我們造好,直接拿來使用即可。以下是教學如何將Zxing開源庫整合到自己專案中,並且自定義掃碼介面,後期可根據自己的業務需求進行修改,最後補充了一點由此延伸的學習技能點。 一. 整合Zing

Elasticsearch資料百萬級別

如果你對去重結果的精準度沒有特殊要求,使用cardinality聚合函式         AggregationBuilders.cardinality("deviceCount").field("deviceID").precisionThreshold(自定義一個精度範

遮蔽瀏覽器右鍵選單功能,定義右鍵選單相容IE8

做了個自定義右鍵選單的功能,和獲取選中文字內容相關,一起記錄一下。 網上查閱嘗試了很多方式,選擇了一個較為簡潔的方式實現,程式碼很少,進行細節調整後發現存在IE8相容性問題,又查閱資料後進行了優化,目前可以完美相容IE8,但注意jQuery版本必須1.7+,我

7-8 連結串列25 分

給定一個帶整數鍵值的連結串列 L,你需要把其中絕對值重複的鍵值結點刪掉。即對每個鍵值 K, 只有第一個絕對值等於 K 的結點被保留。同時,所有被刪除的結點須被儲存在另一個連結串列上。 例如給定 L 為 21→-15→-15→-7→15,你需要輸出去重後的連結串列 21→-15