1. 程式人生 > >Java集合Set(三)

Java集合Set(三)

als *** print ascii碼 控制臺顯示 無序 r12 hour 使用

***************************Set*********************************************

類似數學中的集合


叠代順序相關 排序相關的

Set(接口)


HashSet(實現類) 1.去重 2.沒有叠代順序 SortedSet(接口)

LinkedHashSet(實現類) 有叠代順序的HashSet NavigableSet(接口)

TreeSet(實現類)


集合的兩個設計原則

1. Ordered 叠代順序(輸出順序、遍歷順序)


2. Sorted 排序順序


*************************************HashSet***************************************

唯一性、無序性、確定性

唯一性: 不能重復

特點:

1. 去重


2. 沒有叠代順序


不是說順序是隨機的,每次運行順序都是固定的..沒有叠代順序的意思是它的輸出順序和添加順序不一致的

順序: 是和對象的hashCode相關的一個算法,求出這個int類型的數值 作為數組的一個下標 存到數組中的

實質都是數組


****************************LinkedHashSet*************************

有叠代順序的HashSet

它的輸出順序和添加順序是一致的


先打進來的客戶 先給它打出去 要使用LinkedHashSet

**************************HashSet是如何去重的?(面試題)*****************************


使用hashCode()和equals()去重


如果兩個對象 hashCode() 相等 、equals()比較結果是true 兩個對象意義上是同一個對象 第二個會被去掉


hashCode()和equals()只要有一個不相等 就不是同一個對象 第二個會被添加進去


****************************請說出往HashSet中添加元素時的具體執行過程******************

set.add(dvd1);//添加第一個元素 首先調用第一個對象的hashCode()算法 得到一個hashCode


並且把這個hashCode 的值 放到一個數組中


int[] hashCodeArr = {10,10,10}


如果有重復的hashCode繼續比較equals,拿著當前添加的對象和集合中的所有元素挨個比較equals.

如果沒有重復的hashCode,就不會調用equals.


set.add(dvd1);
set.add(dvd2);
set.add(dvd3);
set.add(dvd4);

控制臺顯示效果如下:


hashCode
hashCode
equals
hashCode
equals
equals
hashCode
equals
equals
equals


*********************************TreeSet**************************************

排序相關的Set,直接把想要排序的元素添加到TreeSet中 就自動幫你排序好了 底層用的是 紅黑樹

*********************************自然排序**************************************


package com.chapter12.set;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

/**
* 公司:藍橋軟件學院 作者:zhangzy 時間:2017年7月18日 上午10:46:03 功能:演示自然排序
*/
public class 演示自然排序 {

public static void main(String[] args) {

// 1.對數字排序
/*
* Set<Integer> set = new TreeSet<Integer>();
*
* set.add(3);
*
* set.add(1);
*
* set.add(5);
*
* for(int i:set){ System.out.println(i); }
*/

// 2.對字符串排序
// 排序字符串 按照ascii碼排序
//先取第一個字符 先按第一個字符的ascii碼排序
//如果第一個字符相同 依次取第2個
/*Set<String> set = new TreeSet<String>();

set.add("bba");

set.add("baa");

set.add("aaa");

for (String s : set) {
System.out.println(s);
}*/

//3. 對日期和時間進行排序 時間早的 小 在左邊
String s1 = new String("2017-07-19 00:00:00");
String s2 = new String("2017-07-18 00:00:00");
String s3 = new String("2017-07-21 00:00:00");
String s4 = new String("2017-07-20 00:00:00");

Set<Date> set = new TreeSet<Date>();

//字符串--------->Date對象
//yyyy year 年
//MM month 月
//dd day 日期
//hh hour
//mm minute
//ss second
/*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

try {
Date date1 = sdf.parse(s1);
Date date2 = sdf.parse(s2);
Date date3 = sdf.parse(s3);
Date date4 = sdf.parse(s4);

set.add(date1);
set.add(date2);
set.add(date3);
set.add(date4);

for(Date date:set){
System.out.println(date);
}
} catch (ParseException e) {

e.printStackTrace();
}*/

//Date------------>String對象
//需求: 創建當前時間
Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

String currentTime = sdf.format(date);

System.out.println(currentTime);

}
}

*****************************使用TreeSet實現DVD排序****************************

先按DVD的名稱排序、名稱相同的按價格排序


演示代碼:


package com.chapter12;

public class DVD implements Comparable{

private int no;
private String name;
private int price;


@Override
public int compareTo(Object obj){

//1.先按DVD的名稱排序
DVD otherDVD = (DVD)obj;
int nameResult = this.name.compareTo(otherDVD.getName());

if(nameResult==0){//名稱相同
//2.按照價格排序
int priceResult = new Integer(this.price).compareTo(otherDVD.getPrice());
return priceResult;
}else{
return -nameResult;
}

}


public static void main(String[] args) {
DVD dvd1 = new DVD(1,"神偷奶爸3",50);
DVD dvd2 = new DVD(2,"神偷奶爸3",50);
System.out.println(dvd1==dvd2);//false
System.out.println(dvd1.equals(dvd2));//true

System.out.println(dvd1.hashCode());
System.out.println(dvd2.hashCode());
}
}

測試代碼:


package com.chapter12.set;

import java.util.Set;
import java.util.TreeSet;

import com.chapter12.DVD;

/**
* 公司:藍橋軟件學院
* 作者:zhangzy
* 時間:2017年7月18日 下午2:09:08
* 功能: 往TreeSet中添加的對象 有要求 對象所屬的類 一定要實現Comparable接口才能夠添加到TreeSet中進行排序
* DVD類如果沒有實現Comparable接口 編譯是可以通過的 運行時報錯 com.chapter12.DVD cannot be cast to java.lang.Comparable
*/
public class 演示DVD排序 {

public static void main(String[] args) {

DVD dvd1 = new DVD(1,"bbb",50);
DVD dvd2 = new DVD(2,"aaa",50);

DVD dvd3 = new DVD(3,"aaa",40);
DVD dvd4 = new DVD(4,"aaa",60);

DVD dvd5 = new DVD(5,"ccc",60);

Set<DVD> set = new TreeSet<DVD>();

set.add(dvd1);
set.add(dvd2);
set.add(dvd3);
set.add(dvd4);
set.add(dvd5);

for(DVD dvd:set){
System.out.println(dvd);
}
}
}

*****************************TreeSet是使用compareTo()方法去重****************************

1.兩個對象compareTo()比較結果如果是0,認為兩個對象意義上是同一個對象,第二個會被去掉


2.兩個的對象equals()比較結果是true,兩個對象compareTo()比較結果一定要是0


因為兩個對象equals()比較結果是true,說明它倆意義上是同一個對象,這樣第二個應該被去掉,為了保證第二個對象
被去掉,所以它們的compareTo()比較結果一定要是0


3.重寫 equals()使用的條件,compareTo()也要用

這樣compareTo()的比較條件 被equals()卡死了,equals()用什麽條件,compareTo()也要用什麽條件

******************************第二個比較接口-------Comparator*****************************

需求: 想按DVD的編號排序


第一步: 先寫一個排序規則類 實現Comparator接口


//第一步: 定義一個排序規則類
public class SortedDVDByNo implements Comparator<DVD>{

@Override
public int compare(DVD dvd1, DVD dvd2) {


Integer thisNO = dvd1.getNo();
Integer anotherNo = dvd2.getNo();

int noResult = thisNO.compareTo(anotherNo);
return noResult;
}


}


第二步:

package com.chapter12.set;

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

import com.chapter12.DVD;

/**
* 公司:藍橋軟件學院
* 作者:zhangzy
* 時間:2017年7月18日 下午2:54:20
* 功能:使用排序工具類進行排序
*/
public class TestCollections {

public static void main(String[] args) {

List<DVD> list = new ArrayList<DVD>();

DVD dvd1 = new DVD(3,"bbb",50);
DVD dvd2 = new DVD(1,"aaa",50);

DVD dvd3 = new DVD(2,"aaa",40);

list.add(dvd1);
list.add(dvd2);
list.add(dvd3);


//Collections.sort(list, new SortedDVDByNo());
Collections.sort(list);

for(DVD dvd:list){
System.out.println(dvd);
}
}
}

*****************************************兩個排序工具類************************************


Object
--Collections(排序集合的 只能用來排序List)

--Arrays(排序數組的)

演示代碼:


package com.chapter12.set;

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

import com.chapter12.DVD;

/**
* 公司:藍橋軟件學院
* 作者:zhangzy
* 時間:2017年7月18日 下午2:54:20
* 功能:使用排序工具類進行排序
*/
public class TestArrays {

public static void main(String[] args) {


DVD[] dvdArr = new DVD[3];


DVD dvd1 = new DVD(3,"bbb",50);
DVD dvd2 = new DVD(1,"aaa",50);

DVD dvd3 = new DVD(2,"aaa",40);

dvdArr[0] = dvd1;
dvdArr[1] = dvd2;
dvdArr[2] = dvd3;


Arrays.sort(dvdArr,new SortedDVDByNo());

for(DVD dvd:dvdArr){
System.out.println(dvd);
}
}
}

Java集合Set(三)