# 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());
}
``````````