2019-01-13

基于Map集合重點(diǎn)整理及其撲克牌補(bǔ)充手中牌的排序

Map集合

1.1Map集合概念
  • Map集合是一種存放關(guān)系對象的對象的雙列集合棺弊。
img.png
1.2Map集合的常用子類

HashMap<K,V>

  • 1.數(shù)據(jù)存儲方式:哈希表結(jié)構(gòu)艾帐。
  • 2.存儲情況:無序
  • 3.保證鍵的唯一性方式:需要重寫鍵的hashCode()方法令蛉、equals()方法驶赏。

LinkedHashMap<K,V>聘殖,是HashMap的一個子類凡人。

  • 1.數(shù)據(jù)存儲方式:哈希表結(jié)構(gòu)+鏈表結(jié)構(gòu)
    存儲數(shù)據(jù)采用的哈希表結(jié)構(gòu)+鏈表結(jié)構(gòu)锋谐。
    (1.鏈表結(jié)構(gòu):保證元素的存取順序一致觅玻。
    (2.哈希表結(jié)構(gòu):保證的鍵的唯一想际、不重復(fù)。
  • 3.同樣需要重寫鍵的 hashCode()方法溪厘、equals()方法胡本。

注意:K, V泛型類型可以一致畸悬,也可以不一致侧甫。

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author lx
 * @date 2019/1/3 - 17:25
 * public V put(K key, V value) :  把指定的鍵與指定的值添加到Map集合中。
 * public V remove(Object key) : 把指定的鍵 所對應(yīng)的鍵值對元素 在Map集合中刪除蹋宦,返回被刪除元素的值披粟。
 * public V get(Object key) 根據(jù)指定的鍵,在Map集合中獲取對應(yīng)的值冷冗。
 * boolean containsKey(Object key) 判斷集合中是否包含指定的鍵守屉。
 * public Set<K> keySet() : 獲取Map集合中所有的鍵,存儲到Set集合中蒿辙。
 * public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)
 */
public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String, String> hashMap = new HashMap<>();
        //添加元素
        hashMap.put("馮小剛", "范冰冰");
        hashMap.put("李晨", "范冰冰");
        //如果鍵相同拇泛,值不同時,直接會覆蓋前面的Value值思灌。
        hashMap.put("馮小剛", "徐帆");

        hashMap.put("馮紹峰", "趙麗穎");
        hashMap.put("霍建華", "林心如");
        hashMap.put("楊冪", "劉愷威");

        System.out.println(hashMap);
        //{馮紹峰=趙麗穎, 霍建華=林心如, 馮小剛=徐帆, 李晨=范冰冰, 楊冪=劉愷威}
            //通過Key刪除元素
            hashMap.remove("楊冪");
        System.out.println(hashMap);
        //{馮紹峰=趙麗穎, 霍建華=林心如, 馮小剛=徐帆, 李晨=范冰冰}

        //獲取指定鍵key的value值
        String s = hashMap.get("霍建華");
        System.out.println(s);//林心如

        //判斷集合中是否包含指定鍵
        System.out.println(hashMap.containsKey("楊冪"));//在這之前已經(jīng)被刪除了俺叭,返回false

        //判斷集合中是否含有指定value值(一般很少用)
        System.out.println(hashMap.containsValue("范冰冰"));//true

        //獲取集合中的所有鍵,并存儲到集合中
        Set<String> set=hashMap.keySet();
        System.out.println(set);//[馮紹峰, 霍建華, 馮小剛, 李晨]

            //獲取  鍵值對  對象的集合
        Set<Map.Entry<String,String>> set1=hashMap.entrySet();
        System.out.println(set1);//[馮紹峰=趙麗穎, 霍建華=林心如, 馮小剛=徐帆, 李晨=范冰冰]

        //遍歷獲取到的鍵值對的集合
        for (Map.Entry<String,String> ss:set1) {
            System.out.println(ss);
            /*
            馮紹峰=趙麗穎
            霍建華=林心如
            馮小剛=徐帆
            李晨=范冰冰
             */
        }
    }
}
Entry鍵值對對象
  • Key(鍵)+Value(值)=Map集合中的Entry項(xiàng)泰偿。
  • Entry將鍵值對封裝成了鍵值對 對象熄守。方便了我們從每一個Entry對象獲取對應(yīng)的與對應(yīng)的
Map集合遍歷鍵值對的方式

通過集合中每個鍵值對(Entry)對象,獲取鍵值對(Entry)對象中的鍵與值裕照。

    1. 獲取Map集合中攒发,所有的鍵值對(Entry)對象,以Set集合形式返回晋南。使用entrySet()方法晨继。
    1. 遍歷包含鍵值對(Entry)對象的Set集合,得到每一個鍵值對(Entry)對象搬俊。
    1. 通過鍵值對(Entry)對象聪铺,獲取Entry對象中的鍵與值涩拙。使用getkey() 方法和getValue()。
package hashMap_demo;

import java.util.HashMap;

import java.util.Map;
import java.util.Set;

/**
 * public K getKey() :獲取Entry對象中的鍵输玷。
 * public V getValue() :獲取Entry對象中的值檀葛。
 * 在Map集合中也提供了獲取所有Entry對象的方法:
 * public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對對象的集合(Set集合)
 */
public class EntryDemo {

    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(20, "aa");
        map.put(18, "bb");
        map.put(20, "dd");
        map.put(25, "gg");
        map.put(28, "cc");

//      使用hashMap集合對象調(diào)用entrySet方法獲取Set的所有的entry對象玩祟,
        Set<Map.Entry<Integer, String>> entries = map.entrySet();

        for (Map.Entry<Integer, String> entry : entries) {
            int aInt = entry.getKey();
            String ss = entry.getValue();
            System.out.println(aInt + "cp是" + ss);
            //輸出結(jié)果:
            //18cp是bb
            //20cp是dd
            //25cp是gg
            //28cp是cc

            //Map集合不能直接使用迭代器或者foreach進(jìn)行遍歷。但是轉(zhuǎn)成Set之后就可以使用了

        }
    }
}
HashMap存儲自定義類型鍵值
  • 練習(xí):每位學(xué)生(姓名屿聋,年齡)都有自己的家庭住址空扎。
  • 那么,既然有對應(yīng)關(guān)系润讥,則將學(xué)生對象和家庭住址存儲到 map集合中转锈。學(xué)生作為鍵, 家庭住址作為值。
  • 注意楚殿,學(xué)生姓名相同并且年齡相同視為同一名學(xué)生撮慨。
package hashMap_demo;

import java.util.Objects;

/**
 * @author lx
 * @date 2019/1/13 - 18:15
 */
public class Student {
    //創(chuàng)建變量
    private String name;
    private int age;
//默認(rèn)構(gòu)造器
    public Student() {
    }
//有參構(gòu)造器
    public Student(String name, int age) {
        this.name=name;
        this.age=age;
    }
//setter getter方法
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge() {
        this.age = age;
    }
//equals方法首先判斷傳入的是否與本類中的相同,相同則返回true
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }//其次再判斷如果為空或者類名不同脆粥,則直接返回false
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        //將Object類型強(qiáng)轉(zhuǎn)為Student類型砌溺,構(gòu)成內(nèi)容給的比較
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, age);
    }
//重寫toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//保證鍵值的唯一性
    @Override
    public int hashCode() {
        return Objects.hash(name,age);
    }
}

定義測試類:

package hashMap_demo;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author lx
 * @date 2019/1/13 - 18:39
 */
public class Entry_Demo {
    public static void main(String[] args) {
        Map<Student,String> map=new HashMap<>();
        map.put(new Student("趙穎", 20), "河北");
        map.put(new Student("陳爽", 25), "湖南");
        map.put(new Student("張亞藍(lán)", 29), "廈門");
        map.put(new Student("呂小童", 32), "陜西");
        map.put(new Student("趙穎",20),"山西");
        Set<Student> studentSet=map.keySet();
        for (Student key:studentSet
             ) {
            String sss = map.get(key);
            System.out.println(key+"的住址是"+sss);
            /*輸出結(jié)果:
              Student{name='趙穎', age=20}的住址是山西
              Student{name='陳爽', age=25}的住址是湖南
              Student{name='呂小童', age=32}的住址是陜西
              Student{name='張亞藍(lán)', age=29}的住址是廈門*/
        }
    }

}

1.當(dāng)給HashMap中存放自定義對象時,如果自定義對象作為key存在变隔,這時要保證對象唯一规伐,必須復(fù)寫對象的hashCode和equals方法。
2.如果要保證map中存放的key和取出的順序一致匣缘,可以使用 java.util.LinkedHashMap 集合來存放猖闪。

LinkedHashMap

它是HashMap下面有一個子類LinkedHashMap,它是鏈表和哈希表組合的一個數(shù)據(jù)存儲結(jié)構(gòu)孵户。
特點(diǎn):有序萧朝,不可重復(fù)

package hashMap_demo;

import java.util.LinkedHashMap;
/**
 * @author lx
 * @date 2019/1/13 - 17:12
 */
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        LinkedHashMap<String,String> linkedHashMap=new LinkedHashMap<>();
                linkedHashMap.put("趙麗穎","馮紹峰");
                linkedHashMap.put("金玟岐","金玟岐");
                linkedHashMap.put("咪咕","王少");
                linkedHashMap.put("卡羅","扎西");
                linkedHashMap.put("趙麗穎","李易峰");
        System.out.println(linkedHashMap);
        /*
        {趙麗穎=李易峰, 金玟岐=金玟岐, 咪咕=王少, 卡羅=扎西}
         */
    }
}

計(jì)算一個字符串中每個字符出現(xiàn)次數(shù)

package hashMap_demo;

import java.util.HashMap;
import java.util.Scanner;

/**
 * @author lx
 * @date 2019/1/13 - 17:41
 * 需求:
 * 計(jì)算一個字符串中每個字符出現(xiàn)次數(shù)
 * 1.從控制臺獲取字符串
 * 2.創(chuàng)建一個集合,一個作為為字符夏哭,一個為次數(shù)
 * 3.將字符串轉(zhuǎn)化為字符检柬,逐個遍歷,判斷是否是第一次出現(xiàn)
 * 4如果是第一次出現(xiàn),Integer設(shè)置為1何址,不是則先獲取上一次的value值里逆。再加一之后存放
 */
public class JiSuanZifuChuan {

    public static void main(String [] args){
        //從控制臺錄入字符串
        Scanner scanner=new Scanner(System.in);
        //獲取字符串
        String next = scanner.nextLine();

        //創(chuàng)建一個集合,存儲字符和次數(shù)
        HashMap<Character, Integer> hashMap = new HashMap<>();

        for (int i = 0; i < next.length(); i++) {
            //獲取字符
            char c = next.charAt(i);
            if (!hashMap.containsKey(c)) {
                hashMap.put(c, 1);
            } else {
                //如果不是第一次用爪,先取出來原押,然后再加一
                Integer integer = hashMap.get(c);

                hashMap.put(c, ++integer);
            }

        }
        System.out.println(hashMap);
    }
}
jdk9.0添加的優(yōu)化

1:of()方法只是Map,List偎血,Set這三個接口的靜態(tài)方法诸衔,其父類接口和子類實(shí)現(xiàn)并沒有這類方法。比如 HashSet颇玷,ArrayList等笨农;
2:返回的集合是不可變的.

public class Demo01 {  
  public static void main(String[] args) {  
      List<String> list = new ArrayList<>();        
        list.add("abc");
        list.add("def");     
        list.add("ghi");   
     System.out.println(list);  //[abc, def, ghi]  
       }
 }
package hashMap_demo;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author lx
 * @date 2019/1/13 - 18:09
 */
public class HelloJDK9 {
    public static void main(String[] args) {
//        of方法設(shè)置后,集合不可變
        
        Set<String> str1 = Set.of("a", "b", "c");
//        str1.add("c");    這里編譯的時候不會錯帖渠,但是執(zhí)行的時候會報錯谒亦,因?yàn)槭遣豢勺兊募?        System.out.println(str1);//[a, c, b]
        
        Map<String, Integer> str2 = Map.of("a", 1, "b", 2);
        System.out.println(str2);//{a=1, b=2}
        
        List<String> str3 = List.of("a", "b");
        System.out.println(str3);//[a, b]
    }
}

模擬斗地主洗牌發(fā)牌

  • 使用面向?qū)ο蟮姆绞綄?shí)現(xiàn)斗地主洗牌發(fā)牌的操作
package douDiZhu;

import java.security.Key;
import java.util.*;

/**
 * @author lx
 * @date 2019/1/13 - 18:24
 *
 * 創(chuàng)建三個玩家
 * 
 * 創(chuàng)建牌
 * 構(gòu)造牌盒
 * 洗牌
 * 發(fā)牌
 * 看牌
 *
 */
public class DouDiZhu {
    public static void main(String[] args) {
        //創(chuàng)建牌數(shù)組
        String [] as={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//        創(chuàng)建花色
        String [] poker_color={"?","?","?","?"};
            //創(chuàng)建牌盒
        Map<Integer,String> map=new LinkedHashMap<>();
       //初始化索引為1
        int count=1;

        for (int i = 0; i <as.length; i++) {
            for (int j = 0; j <poker_color.length; j++) {
                //將牌的數(shù)字和花色組合遍歷
                String sm=as[i]+poker_color[j];
                //索引自增
                map.put(count++,sm);
            }
        }
        //添加大王小王牌面
        map.put(count++,"小王??");
        map.put(count++,"大王??");
                //將map集合對象的鍵存放在set集合中
            Set<Integer> set=map.keySet();
            //創(chuàng)建ArrayList集合
        ArrayList<Integer> arrayList=new ArrayList<>();
        //將set集合元素全部存入ArrayList集合中
        arrayList.addAll(set);

        //洗牌
        Collections.shuffle(arrayList);
//        發(fā)牌
//          創(chuàng)建三個玩家和三張底牌的索引
        ArrayList<Integer> Wanjia1=new ArrayList<>();
        ArrayList<Integer> wanjia2=new ArrayList<>();
        ArrayList<Integer> wanjia3=new ArrayList<>();
        ArrayList<Integer> dipaiNo=new ArrayList<>();
                //給每個玩家發(fā)牌
        for (int i = 0; i <arrayList.size() ; i++) {
            Integer integer=arrayList.get(i);
            if (i>=51) {
                dipaiNo.add(integer);
            } else{
                if (i%3==0){
                Wanjia1.add(integer);
                } else if (i%3==1) {
                    wanjia2.add(integer);
                }else {
                    wanjia3.add(integer);
                }}
        }
                //將手中的牌按照大小排序
        Collections.sort(Wanjia1);
        Collections.sort(wanjia2);
        Collections.sort(wanjia3);
        Collections.sort(dipaiNo);

            //創(chuàng)建玩家的牌面集合
        ArrayList play1=new ArrayList();
        ArrayList play2=new ArrayList();
        ArrayList play3=new ArrayList();
        ArrayList dipai=new ArrayList();
            //遍歷 根據(jù)鍵來獲得值(牌面)
        for (Integer is:Wanjia1) {
            String value = map.get(is);
            play1.add(value);
        } for (Integer is:wanjia2) {
            String value = map.get(is);
            play2.add(value);
        } for (Integer is:wanjia3) {
            String value = map.get(is);
            play3.add(value);
        }for (Integer is:dipaiNo) {
            String value = map.get(is);
            dipai.add(value);
        }
        //看牌
        System.out.println("哈兒"+play1);
        System.out.println("逗逼" +play2);
        System.out.println("傻子"+play3);
        System.out.println("底牌"+dipai);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市空郊,隨后出現(xiàn)的幾起案子份招,更是在濱河造成了極大的恐慌,老刑警劉巖狞甚,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锁摔,死亡現(xiàn)場離奇詭異,居然都是意外死亡入愧,警方通過查閱死者的電腦和手機(jī)鄙漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棺蛛,“玉大人怔蚌,你說我怎么就攤上這事∨陨蓿” “怎么了桦踊?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長终畅。 經(jīng)常有香客問我籍胯,道長,這世上最難降的妖魔是什么离福? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任杖狼,我火速辦了婚禮,結(jié)果婚禮上妖爷,老公的妹妹穿的比我還像新娘蝶涩。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布绿聘。 她就那樣靜靜地躺著嗽上,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熄攘。 梳的紋絲不亂的頭發(fā)上兽愤,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音挪圾,去河邊找鬼浅萧。 笑死,一個胖子當(dāng)著我的面吹牛哲思,可吹牛的內(nèi)容都是我干的惯殊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼也殖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了务热?” 一聲冷哼從身側(cè)響起忆嗜,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崎岂,沒想到半個月后捆毫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冲甘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年绩卤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片江醇。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡濒憋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陶夜,到底是詐尸還是另有隱情凛驮,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布条辟,位于F島的核電站黔夭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羽嫡。R本人自食惡果不足惜本姥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杭棵。 院中可真熱鬧婚惫,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至密浑,卻和暖如春蛙婴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尔破。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工街图, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懒构。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓餐济,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胆剧。 傳聞我的和親對象是個殘疾皇子絮姆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 自從看見你的第一眼 我的心就亂了 臉上,總是泛著紅暈 我不知道你的名字 每天下午三點(diǎn) 你都會出現(xiàn)在固定的那個路口 ...
    冷冬年閱讀 783評論 82 134
  • 剛喬遷那陣子我工作有點(diǎn)忙秩霍,老媽自告奮勇前來幫忙篙悯,做些收收揀揀,洗洗曬曬之類沒多少技術(shù)指標(biāo)的事兒铃绒。老媽幾番乾坤大挪移...
    免貴姓汪閱讀 358評論 2 2
  • 這兩年的我鸽照,總與困境和艱危作戰(zhàn),總是生存在懸崖邊颠悬,有種靈魂出竅的感覺矮燎,夢境中醒來,總是一身冷汗赔癌,生活如此艱辛诞外,身累...
    森森然閱讀 269評論 0 2