2019-05-27 Java学习日记 day17
Hashset集合
存儲字符串并遍歷
import java.util.HashSet;public class dmo1_hashset {//set集合,無索引,不可以重復,無序(存取不一致)public static void main(String[] args) {HashSet<String> hSet=new HashSet<>(); //創建hashset對象boolean b1=hSet.add("a");boolean b2=hSet.add("a"); //當向set集合中存儲重復元素的時候返回為falsehSet.add("b");hSet.add("c");hSet.add("d");System.out.println(hSet); //hashset的繼承體系中有重寫toString方法//System.out.println(b1);//System.out.println(b2);for (String string : hSet) { //只要能用迭代器迭代的,就可以使用增強for循環遍歷 System.out.println(string);}}} 案例?
存儲自定義對象保證元素唯一性
Hashset原理
我們使用set集合都是需要去掉重復元素的,如果在存儲的時候逐個equals()比較,效率較低,哈希算法提高了重復的效率,降低了使用equals()方法的次數
當Hashset調用add()方法存儲對象的時候,先調用對象的hashset()方法得到一個哈希值,然后在集合中查找是否有哈希值相同的對象:
如果沒有哈希值相同的對象就直接存入集合
如果有哈希值相同的對象,就和哈希值相同的對象逐個進行equals()比較,比較結果為false就存入,true則不存
?
將自定義累的對象存入Hashset去重復
類中必須重寫hashCode()和equals()方法
hashCode():屬性相同的對象返回值此項相同,屬性不同的返回值盡量不同(提高效率)
equals():屬性相同返回true,屬性不同返回false,返回false的時候存儲
?
import java.util.HashSet;import tan.jung.bean.Person;public class demo2_hashset {public static void main(String[] args) {HashSet<Person> hs =new HashSet<>();hs.add(new Person("張三",23));hs.add(new Person("張三",23));hs.add(new Person("張三",23));hs.add(new Person("李四",24));hs.add(new Person("李四",24));System.out.println(hs); //需要重寫equals和HashCode方法 }}//第二個包 public class 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();// TODO Auto-generated constructor stub }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}/*@Overridepublic boolean equals(Object obj) {System.out.println("執行了");Person p=(Person)obj;return this.name.equals(p.name) && this.age == p.age; }@Overridepublic int hashCode() {final int num=38;return name.hashCode() * num +age;}*/@Overridepublic int hashCode() {final int prime = 31; //31是一個質數,質數是能被1和自己本身整除的數 ,即不大也不小,比較好算,2的五次方-1,2向左移動五位int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj) //調用的對象和傳入的對象是同一個對象return true; //直接返回rute if (obj == null) //傳入的對象為nullreturn false; //返回falseif (getClass() != obj.getClass()) //判斷兩個對象對應的字節碼未見是否是同一個字節碼return false; //如果不是直接返回falsePerson other = (Person) obj; //向下轉型if (age != other.age) //調用對象的年內不等于傳入對象的年齡return false; //返回falseif (name == null) { //調用對象的姓名不為nullif (other.name != null) //傳入對象的姓名不為nullreturn false; //返回false} else if (!name.equals(other.name)) //調用對象的姓名不等于傳入對象的姓名return false; //返回flasereturn true; //返回true } }?
?
LinkedHashset
特點:
可以保證怎么存就怎么取
底層是連帶實現的,是set集合中唯一一個能保證怎么存怎么取得集合對象
因為Hashset的子類,所以也是保證元素唯一的,與Hashset的原理一樣
?
隨機數
public class test1 {public static void main(String[] args) {//創建Random類創建隨機數對象Random r1=new Random();//不能重復,需要用Hashset方法HashSet<Integer> hs1=new HashSet<>();//hashset的size是下雨10就可以不斷存儲,如果大于等于10就停止存儲while (hs1.size()<10) {//通過random類中的nextInt(n)方法獲取1到20之間的隨機數,并將這些隨機數存現在hashset集合中hs1.add(r1.nextInt(21));}//遍歷Hashsetfor (Integer integer : hs1) {System.out.println(integer);}} 練習題鍵盤輸入,去掉重復
import java.util.HashSet; import java.util.Scanner;import javax.sound.sampled.Line;public class test2 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("請輸入"); //創建Hashset獨享,將字符存儲,去掉重復HashSet<Character> hs1 =new HashSet<>();//將字符串轉換成字符數組,獲取每一個字符存儲在Hashset集合中,自動去除重復String line=sc.nextLine(); char[] arr=line.toCharArray();for (char c : arr) { //遍歷字符數組 hs1.add(c);}//遍歷Hashset,打印每一個字符for(Character ch:hs1){System.out.println(ch);}}} 練習題去除集合中的重復
import java.util.ArrayList; import java.util.LinkedHashSet;public class test3 {public static void main(String[] args) {ArrayList<String> list=new ArrayList<>();list.add("a");list.add("a");list.add("a");list.add("a");list.add("b");list.add("b");list.add("c");getSingle(list); //調用方法 System.out.println(list);}public static void getSingle(ArrayList<String> list) {LinkedHashSet<String> lsh=new LinkedHashSet<>();lsh.addAll(list); //添加list元素 list.clear(); //清除list元素 list.addAll(lsh); //將LinkedHashset集合中的元素添加會list集合中 }} 練習題?
TreeSet
Treeset存儲Integer類型的元素并遍歷
import java.util.TreeSet;public class demo4_TreeSet {//TreeSet集合是用來對對象元素進行排序的,同事也可以保證元素的唯一public static void main(String[] args) {TreeSet<Integer> ts1=new TreeSet<>();ts1.add(1);ts1.add(1);ts1.add(2);ts1.add(2);ts1.add(3);ts1.add(3);ts1.add(3);ts1.add(4);ts1.add(4);System.out.println(ts1);}} 案例TreeSet存儲自定義對象
?
二叉數:兩個叉
?
小的存儲在左邊(負數),打的存儲在右邊(整數),相等就不存(0)
?
compareTo方法,在TreeSet集合如何存儲元素取決于compareTo方法的返回值
?
返回0,集合中只有一個元素
?
返回負數集合會將存儲的元素倒序
返回整數會怎么存怎么取
?
import java.util.Iterator; import java.util.TreeSet;import tan.jung.bean.Person;/*當compareTo方法返回0的時候集合中只有一個元素*當compareTo方法返回整數的時候集合會怎么存就怎么取*當compareTo方法返回負數的時候集合會倒序存儲* */ public class demo5_TreeSet {public static void main (String args[]){TreeSet<Person> ts1=new TreeSet<>();ts1.add(new Person("xx",20));ts1.add(new Person("hh",20)); ts1.add(new Person("nn",20));ts1.add(new Person("mm",20));Iterator<Person> it1=ts1.iterator();while (it1.hasNext()) {Person p1=it1.next();System.out.println(p1.getName()+" "+p1.getAge());}//System.out.println(ts1); }}//第二個包 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();// TODO Auto-generated constructor stub }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}/*@Overridepublic boolean equals(Object obj) {System.out.println("執行了");Person p=(Person)obj;return this.name.equals(p.name) && this.age == p.age; }@Overridepublic int hashCode() {final int num=38;return name.hashCode() * num +age;}*/@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic int compareTo(Person o) {return -1;} } 案例?
按照姓名排序
按照年齡排序
import java.util.Iterator; import java.util.TreeSet;import tan.jung.bean.Person;/*當compareTo方法返回0的時候集合中只有一個元素*當compareTo方法返回整數的時候集合會怎么存就怎么取*當compareTo方法返回負數的時候集合會倒序存儲* */ public class demo5_TreeSet {public static void main (String args[]){//demo1();TreeSet<Person> ts1=new TreeSet<>();ts1.add(new Person("張三",20));ts1.add(new Person("李四",12)); ts1.add(new Person("王五",25));ts1.add(new Person("趙六",11));ts1.add(new Person("七七",11));System.out.println('張'+0);System.out.println('李'+0);System.out.println('王'+0);System.out.println('趙'+0);System.out.println('七'+0);Iterator<Person> it1=ts1.iterator();while (it1.hasNext()) {Person p1=it1.next();System.out.println(p1.getName()+" "+p1.getAge());}}public static void demo1() {TreeSet<Person> ts1=new TreeSet<>();ts1.add(new Person("xx",20));ts1.add(new Person("hh",12)); ts1.add(new Person("nn",25));ts1.add(new Person("mm",11));ts1.add(new Person("ss",11));Iterator<Person> it1=ts1.iterator();while (it1.hasNext()) {Person p1=it1.next();System.out.println(p1.getName()+" "+p1.getAge());}}}//第二個包 import java.awt.RenderingHints;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();// TODO Auto-generated constructor stub }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}/*@Overridepublic boolean equals(Object obj) {System.out.println("執行了");Person p=(Person)obj;return this.name.equals(p.name) && this.age == p.age; }@Overridepublic int hashCode() {final int num=38;return name.hashCode() * num +age;}*/@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}/*@Overridepublic int compareTo(Person o) {int num =this.age-o.age; //年齡是主要條件return num==0 ? this.name.compareTo(o.name) : num;}*/@Overridepublic int compareTo(Person o) {int num=this.name.compareTo(o.name); int num2=this.age-o.age;//姓名是主要條件return num==0 ? num2 :num;}} 案例按照姓名長度排序
public int compareTo(Person o) {int length =this.name.length() - o.name.length(); //比較長度為主要條件int num =length == 0? this.name.compareTo(o.name) :length;//比較內容為次要條件//如果length等于0的話就比較this.name.compareTo(o.name) ,compare比較內容//如果不等于0的話就比較lengthreturn num ==0 ? this.age-o.age :num; //比較年齡為次要條件} 方法?
接口不能直接new 需要給子類對象
public class demo5_TreeSet {public static void main (String args[]){ //demo1();//demo2();//demo3();TreeSet<String> ts1=new TreeSet<>(new CompareByLen()); //compare c=new CompareByLen();ts1.add("abccd");ts1.add("z");ts1.add("bb");ts1.add("sss");System.out.println(ts1);} }class CompareByLen implements Comparator<String>{@Overridepublic int compare(String s1, String s2) { //按照字符串的長度比較int num =s1.length() -s2.length(); //長度為主要條件return num == 0 ?s1.compareTo(s2) : num ; //內容為次要條件 }} 案例?
TreeSet原理
特點:
TreeSet是用來排序的,可以指定一個順序,對象存入之后會按照指定的順序排列
使用方式:
1.自然排序(Comparable)
TreeSet類的add()方法中會把存入的對象提升為Comparable類型
調用對象的compareTo()方法和集合中的對象比較
根據compareTo()方法返回結果進行存儲
2.比較器順序(Comparator)
創建TreeSet的時候可以制定一個Comparatpr
如果傳入了Comparator的子類對象,那么TreeSet就會按照比較器中的順序排序
add()犯法內部會自動調用Comparator接口中compare()方法排序
調用的對象是compare()方法的第一個參數,集合中的對象是compare方法的第二個參數
3.兩種方式區別:
TreeSet構造函數什么都不傳,默認按照類中Comparable的順序(沒有就報錯ClassCasException)
TreeSet如果傳入了Comparator,就優先按照Comparator
轉載于:https://www.cnblogs.com/JungTan0113/p/10930675.html
總結
以上是生活随笔為你收集整理的2019-05-27 Java学习日记 day17的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钱币兑换问题 (完全背包)
- 下一篇: C++实现:自定义数组类型实现相关运算符