java利用自定義類型對樹形數據類型進行排序


前言

為什么集合在存自定義類型時需要重寫equals和hashCode?

1、先說List集合

List集合在存數據時是可以重復的但是 當我們需要判斷一個對象是否在集合中存在時這樣就有問題了!

因為我們通常判斷一個對象是否在集合中存在只需要判斷值就行   而List內部實現方法是用地址來進行判斷的  因為我們在創建對象時即使是值都一樣

但是內存地址不一樣 所以也就無法判定 一個對象是否在另一個對象中存在     我們可以在自定義類中重寫equals方法 只是值相等就證明該對象在集合中存在

2、在說Set集合

Set集合在存自定義類型的數據時 為了要保證唯一性(set集合的特點:數據是不能重復的)我們要重寫hashCode(執行效率高) 和 equals  內部就會自動判斷

如果數據相等就不添加否則就添加到集合中

 

不管是利用Set集合的TreeSet  還是用Map集合的TreeMap  這二個數據類型的共同點都是  只存知道怎么排序的集合這是為什么,如果我們要想存自定義類型的數據該怎么辦?

是因為上面二個集合在add的時候內部調用了基本數據類型的compareTo方法(內部排序是先比較后排序)  這些數據類型(例如String、Double)內部都已經重寫了compareTo方法 所以可以自動排序

而我們在上面二個集合中添加自定義類型的數據時  會報錯編譯不通過(因為樹形數據類型 是不存不知道怎么排序的集合的) 就是因為 自定義類型不知道按什么排序 是添加不到上面集合中去的 這個時候我們也需要重寫compareTo  按我們自定義類型中的某個字段排序就可以了。

重寫compareTo是第一種方法 下面來看下核心代碼及視圖:

public static void main(String[] args) {
//		利用自定義類型 為樹形集合數據類型排序
		
//		1、java自帶的數據類型 為什么可以自動排序呢?
//		因為add方法里調用了 compareTo    java自帶的數據類型都重寫了 compareTo方法
//		2、自定義類型怎么實現自動排序?
//		根據1中的推理  我們也需要再自定義類中重寫 compareTo方法 已到達按哪個字段排序的目的
//		因為樹形數據類型 是不存不知道怎么排序的集合的
		
//		返回值為0:已存在
//		 返回值為正:放到后
//		 返回值為負:放到前
		
		TreeSet<Student> tss = new TreeSet<Student>();

		tss.add(new Student("b",9));
		tss.add(new Student("f",8));
		tss.add(new Student("a",20));
		tss.add(new Student("c",19));
		tss.add(new Student("b",18));
		tss.add(new Student("b",18));
		System.out.println(tss);
		
	}

 

public int compareTo(Student o) {
		// TODO Auto-generated method stub
		int res = this.age - o.age;
		
//	假如年齡相等按照名稱排序
		if(res == 0){
			String name1 = this.name;
			String name2 = o.name;
			return name1.compareTo(name2);
		}else{
			return res;
		}
	}

 

1、圖中的compareTo為什么有參數?       比較需要二個對象進行比較 一個是之前的數據 this  一個是通過參數傳進來的對象  也就是傳統的A類調用B類

2、第二種:可以利用多態 將比較方法提取出來放到一個類中  然后將此類對象作為TreeSet的 成員屬性  通過TreeSet的構造方法為成員屬性賦值 如下圖:

第二種方法的靈活性比較高可以按多種選擇進行排序。實例代碼:

//比較器類
public class Comp1 implements Comparator<Book> {

	@Override
	public int compare(Book o1, Book o2) {
		// TODO Auto-generated method stub
//		先按編號排序在按書名排序 
		int res = o1.getNum() - o2.getNum();
		
		if(res == 0){
			String name1 = o1.getName();
			String name2 = o2.getName();
			return name1.compareTo(name2);
		}else{
			return res;
		}
	}

}

 

TreeSet<Book> ts = new TreeSet<Book>(new Comp1());
		ts.add(new Book("葵花寶典", 2));
		ts.add(new Book("九陰真經",1));
		System.out.println(ts);

 

總結:正負決定排序規則

樹形結構如何保證數據唯一性?

1、HashSet和LinkedHashSet 我們自定義類需要重寫hashCode和equals方法

2、TreeSet 自定義類時需要重寫compareTo方法

3、TreeSet 自定義類時可以創建比較器類

集合排序總結:

1、List集合 可以自己寫排序 (冒泡或者選擇)

2、Set集合

     1)hashSet和LinkedHashSet   無法排序

  2)TreeSet 自然排序 和自定義類型排序(可以利用compareTo和編寫比較器來進行排序)【目的只是為了能夠存自定義類型的數據】

3、Map集合同Set集合一樣

4、Collections工具類中一些方法的操作只針對List集合(不針對沒有下標的集合)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM