1. 程式人生 > >集合TreeSet【java】

集合TreeSet【java】

TreeSet:能夠對元素按照某種規則進行排序。

TreeSet排序方式:TreeSet是構造了一個二叉樹,如果大於就在右子數,小於就在左子樹,等於就不用管

排序有兩種方式A:自然排序B:比較器排序

TreeSet的特點:排序和唯一

建立無參構造的TreeSet物件的排序方式是自然排序

建立帶參構造的TreeSet物件的排序方式是比較器排序

A:自然排序
自定義:建立集合物件時是無參構造
如果一個類進行自然排序,那麼這個類就要實現自然排序的介面Compareable
B:比較器排序
自定義:建立集合物件時是帶參構造,引數是new 自定義的類(),這個自定義的類要實現Comparator介面

在自定義儲存中無論是自然排序還是比較器排序重寫compareTo方法時,都是不緊要比較首要條件也要比較次要條件

自定義儲存中,自然排序是Compareable,比較器排序是compareTo,注意不一樣的哦

自然排序的程式碼:

封裝類person中

package day17.treeSet.zdy;
/**
 * 如果一個類進行自然排序,那麼這個類就要實現自然排序的介面Compareable
 * @author Fanny
 * 
 * 
 * TreeSet自然排序是構造了一個二叉樹,如果大於就在右子數,小於就在左子樹,等於就不用管
 *
 */
public class Person implements Comparable<Person>{
	
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
	}
	
	@Override
	public int compareTo(Person o) {
		//比較的首要條件就得有兩個變數,但是這隻有一個引數o,那麼那一個在哪呢?
		//			由於加入進去的就是this,因此那一個就用this.  進行呼叫
		
		//根據要求先比較首要條件年齡
		int num = this.age-o.age;
		//但是如果只考慮首要條件,就不準確,因為會有年齡相同而姓名不相同,不考慮次要條件,那麼這種情況就會被捨棄,顯然不合理。
		//因此當年齡相同時(num==0)就比較姓名,根據姓名的比較差進行返回,
		//	             不相同時,根據年齡差進行返回
		int num2 = num == 0 ? this.name.compareTo(o.name) : num;
		return num2;
	}

}
測試類:
package day17.treeSet.zdy;
/**
 * TreeSet採用自定義儲存,保證 	唯一和排序
 * 排序方式:採用自然排序,按照年齡進行排序
 * 成員變數值都相同即相同
 */
import java.util.TreeSet;

public class TreeSetDemo {
	public static void main(String[] args) {
		
		TreeSet<Person> ts = new TreeSet<>();
		
		Person p1 = new Person("abc",27);
		Person p2 = new Person("bcd",25);
		Person p3 = new Person("def",22);
		Person p4 = new Person("abc",27);
		Person p5 = new Person("npq",18);
		Person p6 = new Person("hhh",20);
		Person p7 = new Person("afg",27);
		Person p8 = new Person("add",22);
		
		ts.add(p1);
		ts.add(p2);
		ts.add(p3);
		ts.add(p4);
		ts.add(p5);
		ts.add(p6);
		ts.add(p7);
		ts.add(p8);
		
		for (Person person : ts) {
			System.out.println(person.getName()+"---"+person.getAge());
		}
	}
}

比較器排序:第一種可以自定義一個類實現comparetor介面,也可以使用匿名內部類

封裝類person:成員變數name,age以及帶參的構造方法,和setXxx(),getXxx()方法

自定義一個類實現comparetor介面

package day17.treeSet.zdy1;

import java.util.Comparator;

public class MyComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		int num = o1.getName().length() - o2.getName().length();
		int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
		int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2;
		return num3;
	}

}

測試類:
package day17.treeSet.zdy1;

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetDemo {
	public static void main(String[] args) {
		//TreeSet<Person> ts = new TreeSet<>(new MyComparator());//自定義一個類MyComparator實現comparetor介面
		
		TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {//匿名內部類

			@Override
			public int compare(Person o1, Person o2) {
				int num = o1.getName().length() - o2.getName().length();
				int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;
				int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2;
				return num3;
			}

		});
		
		Person p1 = new Person("wanglihong",27);
		Person p2 = new Person("linqingxia",30);
		Person p3 = new Person("xiena",26);
		Person p4 = new Person("wangzulan",28);
		Person p5 = new Person("luhan",27);
		Person p6 = new Person("hejiong",26);
		Person p7 = new Person("wanglihong",27);
		Person p8 = new Person("wanglihong",30);
		
		ts.add(p1);
		ts.add(p2);
		ts.add(p3);
		ts.add(p4);
		ts.add(p5);
		ts.add(p6);
		ts.add(p7);
		ts.add(p8);
		
		for (Person p : ts) {
			System.out.println(p.getName()+"---"+p.getAge());
		}
	}
}

相關推薦

集合TreeSetjava

TreeSet:能夠對元素按照某種規則進行排序。 TreeSet排序方式:TreeSet是構造了一個二叉樹,如果大於就在右子數,小於就在左子樹,等於就不用管 排序有兩種方式A:自然排序B:比較器排序

Java提取JSON數值時遇到數組集合時使用的K-V方式轉換

方法 eee 數組 comm subst arr port jsonarray mob 1.實體類轉換方法 參照文章:http://www.cnblogs.com/dflmg/p/6933811.html 2.K-V方法(此方法比較笨,但是沒有辦法,我現在不知道有沒有相關的

JavaMaven安裝、Eclipse配置以及相關錯誤解決集合

文件 格式 setting BYD cksum runt 文件編碼 原因 完成後 作者嘔血總結,下面寫的每一個錯誤我都遇過 · Maven安裝 · Eclipse配置 · Maven安裝 安裝前請確保已經裝有JDK。 一、 準備Maven程序包 到官網https

javamybatis在使用mybatis進行批量插入,批量更新等批量操作時,切割In集合List進行分批批量操作的java中的切割代碼

lse span ati 批量更新 次數 sublist 調用 size ==       紅字部分代表mybatis的批量操作調用方法:       int num = 0; int maxLength = 200; in

JavaJava 集合學習總結 2018-10-5

Java 集合學習總結 1.Java集合框架是什麼?說出一些集合框架的優點? 每種程式語言中都有集合,最初的Java版本包含幾種集合類:Vector、Stack、HashTable和Array。 隨

javalist集合之元素查重

list集合之元素查重 前言         在將excel表格中的資料插入到資料庫中之前,會先進行對資料庫的一個查重,也就是為了確定excel表格中的資料是否和資料庫中已有的資料是否重複,通過將e

JAVA基礎:集合、泛型、異常、反射

1.集合 集合就是高階陣列,可以存放任意型別的物件,同時可以自動擴容。 集合主要由兩個介面派生而出:Collection和Map Iterator 介面: 是Collection介面的父介面,主要是用於遍歷Collection中的元素。 語法: //構造 Li

JAVAjava中實現map集合的資料存取詳解三種方法。Android程式設計師也是要會寫的

長期維護的Android專案,裡面包括常用功能實現,以及知識點詳解, 當然還有java中的知識點。具體請看github: https://github.com/QQ986945193/DavidAndroidProjectTools 好了,說正題

Java集合系列18(Arrays和Collections工具類)

1、Arrays類 Arrays類常用方法概述: 本類所有方法都是靜態的,本類方法是針對陣列的操作。 //部分Arrays的靜態方法(JDK1.8) static <T> List<T> asList(T... a)

java集合學習——Map 之 LinkedHashMap

前言 jdk 版本 jdk1.8.0_161 UML結構圖 LinkedHashMap:Map 介面的 雜湊表 和 連結列表的 實現。 相對於 HashMap 的特性是:有序性(插入元素的順序有序),因為內部使用了 雙向連結串列實現。 原始碼 建構函式 主要

JAVAJava集合類: Set、List、Map、Queue使用場景梳理

本文主要關注Java程式設計中涉及到的各種集合類,以及它們的使用場景 相關學習資料 目錄 Java集合類基本概念 Java集合類架構層次關係 Java集合類的應用場景程式碼 Java集合類基本概念 在程式設計中,常常需

JDK1.7和1.8中List集合中sort方法排序問題JAVA

上次做專案的過程中遇到一個對list集合排序的問題,一直困擾著我,後來一直到最後找了半天才發現問題所在。 因為我本機上JDK版本是1.8 ,而伺服器中JDK版本是1.7,因此線上下測試的過程中跑資料都好好地, 而到了線上卻總是出現問題,後來查詢很多文章才予以解決,現在特地記

Java 集合系列01(總體框架)

Java集合是Java提供的工具包,包含了常用的資料結構:集合、連結串列、佇列、棧、陣列、對映等。 Java集合工具包的位置是Java.util.*。 Java集合主要可以劃分為四個部分:List列表、Set集合、Map對映、工具類(Iterator迭代器、

JavaTreeset實現自定義排序

兩個類,一個學生類,含姓名和出生日期兩個屬性;還有一個學生排序類,重寫compare函式,自定義排序規則是先比較出生日期,如果相同再比較姓名字母 package birthday; import java.util.Calendar; public class Stud

Java集合(List、Set、Map)遍歷、刪除、比較元素時的小陷阱

主要說明List,其餘兩個都一樣 一、漏網之魚-for迴圈遞增下標方式遍歷集合,並刪除元素 如果你用for迴圈遞增下標方式遍歷集合,在遍歷過程中刪除元素,你可能會遺漏了某些元素。說那麼說可能也說不清楚,看以下示例: import ja

Java遍歷List/Set/Map集合的一些常用方法

/* * 遍歷List/Set/Map集合的一些常用方法 */import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List

javaitoo項目實戰之hibernate 懶載入優化性能

bsp xtra extra pda 程序 前端框架 外連接 獲取 轉換成 在做itoo 3.0 的時候,考評系統想要上線,就開始導入數據了,僅僅導入學生2萬條數據,可是導入的速度特別的慢。這個慢的原因是由於導入的時候進行了過多的IO操作。可是導入成功之後,

javaitoo項目實戰之hibernate 批量保存優化

新的 hibernate 缺點 try 實戰 lis 插入 entity man 在itoo中。基本上每一個系統都有一個導入功能,大量的數據填寫進入excel模板中。然後使用導入功能導入的數據庫中,這樣能夠大大的提高工作效率。那麽導入就涉及到了批量保存數據庫的

Java滾動數組動態規劃UVA - 11137 - Ingenuous Cubrency

得到 lose math scanner light clas details 狀態 ann 滾動數組優化自己畫一下就明白了。 http://blog.csdn.net/u014800748/article/details/45849217 解題思路:本題利用遞推關系解決。

javaTCP和UDP傳輸協議

有序 equal sig [] link 客戶端 數據傳輸 端口 sock TCP協議和UDP協議的比較 TCP的全稱是Transmission Control Protocol (傳輸控制協議) 傳輸控制協議,是一種面向連接的協議,類似打電話 在通信的整個過程中