Set集合 去重和比較方法
阿新 • • 發佈:2019-01-23
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;
}
}