# 8號筆記 ###### tags: `筆記本` ---------------------------------------- # 1.裡面有三種Map的查詢 (1)利用Entry來查詢map的資料(Entry裡包含了一組Key跟value) (2)利用lamda foreach的進階型迴圈把Key跟value印出來,認為比較直觀 (3)因為map沒有繼承Iterable裡的Iterator(游標)所以要把map裡的key值給set存取, 之後把mapsSet.iterator()給Iterator做出遊標查詢 ``` public static void main(String[] args) { Map<String,Integer > map = new HashMap<>(); map.put("a", 5000); map.put("d", 2000); map.put("s", 2000); //foreach for (Map.Entry<String, Integer>entry : map.entrySet()) { System.out.println(entry); } //lamda foreach跟上方的foreach一樣的效果 map.forEach((k,v)->System.out.println("key="+k+",value"+v)); //使用游標 Set<String> mapsSet = map.keySet(); Iterator<String> iterator =mapsSet.iterator(); while(iterator.hasNext())//當我游標所指向的地方有物件 { String key =iterator.next();//我用String去接游標所指向的物件(map的key) System.out.println(key+map.get(key));//印出我游標所指向的Key跟Value } } ``` -------------------------------------------------- # 2.equals (1)當自己新增的物件需要用到equals比較時需要覆寫一個equals()的方法 (2)在複寫equals()方法時hashCode方法也要一起覆寫 ``` public class TestEquals { public static void main(String[] args) { //因為他一開始的equals方法方法是比較兩個物件的記憶體位置,所以我們必須要在那個物件的Class重新復寫一個equals方法 CEquals c1=new CEquals("001"); CEquals c2=new CEquals("001"); System.out.println(c1.equals(c2)); } } ``` ``` public class CEquals { private int id; private String name; //建構方法 public CEquals(String name) { this.name = name; } //當做equals方法時一定要跟hashCode方法一起覆寫 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } //複寫equals方法 @Override public boolean equals(Object obj) {//以c1為主視角進入方法,obj是c2 if(obj instanceof CEquals)//判斷c2是不是一樣的物件(type) { CEquals c1 = (CEquals)obj;//新增一個物件將c2的記憶體位置給存進去 return this.name.equals(c1.name);//回傳這裡物件的name是不是跟傳進來參數物件的name一樣(如果這邊比較的是字串那這裡的equals()就是回傳Strin方法的equals) } //空值或不相同回傳false if(this.name==null) { return false; } return false; } } ``` ----------------------------------------------- # 3.Interface and Collection 1.目前想到有兩種設計 (1)一樣用Class實作interface的各種方法,用一個list去包這個class的物件,類似下方的作法 (2)一樣用Class實作interface的各種方法,用多個list去裝不同方法運算出來的結果 ``` public interface bmi { double BMI(double w,double h);//計算BMI } `````` ```` public class BMIClassA implements bmi { private double wight; private double hegiht; public BMIClassA(double wight, double hegiht) { super(); this.wight = wight; this.hegiht = hegiht; } @Override public double BMI(double w,double h ) {//質做BMI方法 this.wight=w; this.hegiht=h; return wight/(hegiht*hegiht) ; } public double getWight() { return wight; } public double getHegiht() { return hegiht; } ```` ````public class TestBMI { public static void main(String[] args) { List<BMIClassA> listbmi =new ArrayList<BMIClassA>();//存放實作Class的list BMIClassA bmi1 = new BMIClassA(50,1.7);//將物件new出來 BMIClassA bmi2 = new BMIClassA(70,1.8); listbmi.add(bmi1);//將物件丟進去 listbmi.add(bmi2); for (BMIClassA bmiClassA : listbmi) { double bmi = bmiClassA.BMI(bmiClassA.getWight(),bmiClassA.getHegiht());//將計算結果存到變數裡 System.out.println("Bmi="+bmi);//印出計算結果 } } `````` # 4.compareTo 1.如果參數的字符串跟字串相等,則回傳0 2.如果此字串小於參數字串,則回傳一個小於0的值 2.如果此字串大於於參數字串,則回傳一個大於於0的值 `````````` String str1 ="123"; String str2 ="123"; String str3 ="123456"; int int_compareTo =str1.compareTo(str2);//回傳0 System.out.println(int_compareTo); int_compareTo =str1.compareTo(str3);//回傳-3 System.out.println(int_compareTo); int_compareTo =str3.compareTo(str1); System.out.println(int_compareTo);//回傳3 `````````` # Map自訂排序 `````````` Map<String,Integer> map =new HashMap<String, Integer>(); map.put("2",2); map.put("3",7); map.put("6",8); map.put("1",6); map.put("4",5); map.put("5",1); List<Map.Entry<String,Integer>> list =new ArrayList<Map.Entry<String,Integer>>(map.entrySet()); Collections.sort(list,new Comparator<Map.Entry<String, Integer>>(){//自訂排序 public int compare(Map.Entry<String, Integer> e1,Map.Entry<String, Integer> e2){//用compare方法宣告進行比較的參數 return (e1.getKey().compareTo(e2.getKey()));//回傳進行比較map的key大小的結果 } }); `````````` # 印出Map的value 1.keyset()的速度會比entrySet()慢很多,為了提高性能會用entrySet()居多 `````````` Map<String,Integer> map =new HashMap<String, Integer>(); map.put("2",2); map.put("3",7); map.put("6",8); map.put("1",6); map.put("4",5); map.put("5",1); Set setentry =map.entrySet(); Iterator<Map<String,Integer>> it = setentry.iterator(); while(it.hasNext()){ Map.Entry<String,Integer> me = (Entry) it.next(); String strs =(String)me.getKey(); Integer add =(Integer)me.getValue(); System.out.println(strs+"..."+add); } `````````` # set的各種方法 1.https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/457053/ `````````` HashSet<String>set = new HashSet<String>();//宣告 set.add("5");//新增物件 set.add("3"); set.add("2"); set.add("1"); set.add("0"); String[] str =(String[])set.toArray(new String[0]);//將Set轉成陣列存入陣列中 HashSet hset=(HashSet)set.clone();//複製set的元素給hset hset.retainAll(set);//保留或刪除指定元素 Iterator<String> it = hset.iterator(); while(it.hasNext()){ System.out.println(it.next()); } ``````````