1. 程式人生 > >Set集合 去重和比較方法

Set集合 去重和比較方法

Set集合

特點: 無序(沒有下標)  集合中的元素不重複

HashSet

hashset具有去重功能

例:  建立一個hashset 儲存 f f a a b b d d  

HashSet<String> set = new HashSet<>();
set.add("f"); 
set.add("f");
set.add("a");
set.add("a");
set.add("b");
set.add("b");
set.add("d");
set.add("d");
// 增強for迴圈
for (String string : set) {
	System.out.println(string);
}

列印結果 a b d f 

去重且無序(不是按照輸出順序列印)

注意: 列印物件不會自動去重 需要重寫equals和hashcode方法

        去重系統類的物件時不用重寫

 去重: 當新增到Set的物件 HashCode碼不相同時 不會呼叫equals方法,物件直接存到Set集合中       

         hashset相同時 才會呼叫equals方法 檢視是否是同一個物件(是否重複)  是---則無法存入

public static void main(String[] args) {
HashSet<Person1> hashSet = new HashSet<>();
hashSet.add(new Person1("呂布", 25));
hashSet.add(new Person1("呂布", 25));
hashSet.add(new Person1("關羽", 26));
hashSet.add(new Person1("關羽", 26));
hashSet.add(new Person1("趙雲", 23));
hashSet.add(new Person1("趙雲", 23));
for (Person1 person1 : hashSet) {
	System.out.println(person1);
    }
}

LinkedHashSet  有序的HashSet(按照存入集合的順序列印)

// 去重系統類的物件時候 不用重寫equals hashset方法了
public class D1fun4 {
	public static void main(String[] args) {
		HashSet<Integer> set = new HashSet<>();
		while (set.size() < 10) {
			int num = (int)(Math.random()*(20-1+1)+1);
			set.add(num); // 自動裝箱
		}
		for (Integer integer : set) {
			System.out.print(integer + " ");
		}
	}
例: 

利用set集合

去除ArrayList集合中的重複元素(操作原ArrayList)

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("a");
    list.add("a");
    list.add("b");
    list.add("b");
    list.add("c");
    list.add("c");
    list.add("d");
    list.add("d");
    HashSet<String> set = new HashSet<>();
    set.addAll(list);
    System.out.println(set);
    list.clear();  // 清空原有元素 放入被list去重後的元素
    list.addAll(set);
    System.out.println(list);
}
TreeSet

TreeSet用來排序

建立一個TreeSet 新增幾個數 檢視效果

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(66);
treeSet.add(66);
treeSet.add(22);
treeSet.add(77);
treeSet.add(11);
treeSet.add(11);
System.out.println(treeSet);
輸出結果自動去重排序

TreeSet 存入物件

public static void main(String[] args) {
	TreeSet<Person1> set = new TreeSet<>();
	set.add(new Person1("張三", 24));
	set.add(new Person1("王五", 26));
	set.add(new Person1("劉六", 26));
	set.add(new Person1("李四", 23));
	set.add(new Person1("趙四", 20));
	System.out.println(set);
}

列印結果異常

注意:  TreeSet存入物件 列印時 需要實現Comparable介面 或者 建立比較器

寫TreeSet排序規則步驟:

1.實現Comparable介面

// 實現Comparable介面
public class Person implements Comparable<Person>{

}

2.重寫介面中的 comparableTo() 方法

3.編寫你想要的排序規則

@Override
public int compareTo(Person o) {
    int num = this.age - o.getAge();
    return (num==0) ? this.name.compareTo(o.getName()):
    this.age - o.getAge();
}

輸出規則: 以升序輸出

compareTo返回值:

返回0只有一個元素

返回正數列印的資料 正序輸出(不會去重 需要寫compareTo方法)

返回負數列印的資料 倒序輸出

public static void main(String[] args) {
	TreeSet<Person1> set = new TreeSet<>();
	set.add(new Person1("張三", 24));
	set.add(new Person1("張三", 24));
	set.add(new Person1("王五", 26));
	set.add(new Person1("劉六", 26));
	set.add(new Person1("李四", 23));
	set.add(new Person1("趙四", 20));
	System.out.println(set);
}
此時列印報錯 需實現Comparable介面 或者 建立比較器
// 實現Comparable介面
public class Person implements Comparable<Person>{

}
按需求重寫規則
// 重寫比較規則
@Override
public int compareTo(Person1 o) {
	int num = this.age - o.getAge();
	return num == 0 ? 1 : num;
}

例:

集合中儲存字串 按字串長度排序

使用比較器 來進行排序

在比較器中寫需求的排序規則

利用TreeSet的構造方法

直接將比較器的實現類傳進去

在類的外部建立比較器

// 建立比較器
class StringLength implements Comparator<String> {
	// 實現比較方法 重寫比較規則
	@Override
	public int compare(String o1, String o2) {
		// 主要按長度 長度一樣比較字元
		int num = o1.length() - o2.length();
		int c = o1.compareTo(o2); 
		return num == 0 ? c : num;
	}	
}
public class D2fun3 {
	public static void main(String[] args) {
            TreeSet<String> set = new TreeSet<>(new StringLength());
	    set.add("linaiang");
	    set.add("hailong");
	    set.add("liucong");
	    set.add("liyuechen");
	    set.add("wangxiaotie");
	    for (String string : set) {
		System.out.println(string);
	    }
	}
}

例:

程式啟動後, 可以從鍵盤輸入接收多個整數,

直到輸入quit時結束輸入.

把所有輸入的整數倒序排列列印

public class D2fun6 {
	public static void main(String[] args) {
		System.out.println("請輸入整數 輸入quit結束");
		Scanner scanner = new Scanner(System.in);
		TreeSet<Integer> set = new TreeSet<>(new IntPrint());
		
		while (true) {
			String string = scanner.nextLine();
			if (string.equals("quit")) {
				break;
			}
			int num = Integer.parseInt(string);
			set.add(num);
		}
		System.out.println(set);
	}
}
// 建立比較器
class IntPrint implements Comparator<Integer> {

	@Override
	public int compare(Integer o1, Integer o2) {
		int num = o2 - o1;
		return num == 0 ? 1 : num;
	}	
}