読者です 読者をやめる 読者になる 読者になる

kyosho5’s blog

貧乏で数学があまり得意ではない理系出身のエンジニアのブログ

HashSet、という選択肢

私がエンジニアにあるにあたり、最初に選択したプログラミング言語javaであった。




今の現場の案件もjavaがメインであるが、高機能なIDEフレームワークもあるおかげでそこまで頭を抱えることはない、というのが正直なところである。




もちろん、不明点を調べられる環境であることや不明点を教えてくださる先輩が隣にいるということがとんでもなく大きな助けになっていることは間違いない。




まだまだエンジニア歴半年強のポンコツではあるが、少しずつプログラミングの知識を深めていきたいと思っている。




で、表題の件。




今まで仕事の中で使ったことのないものでありながら、その中のcontains()メソッドがかなり便利なことが分かったのでソースの例とともに認めたい。
例題:アルファベットのA~Zおよび*からランダムに手札を4枚持った時、どのような役ができるかを判定する。(アルファベットは複数枚配られる可能性あり、*はワイルドカードであり最大で1枚。)
ポーカーをイメージするとわかりやすい。役はノーペア、ワンペア、スリーカード、ツーペア、フォーカード。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] hand =line.split("");

        judgeYourHand(hand);
    }

    public static void judgeYourHand(String[] yourHand) {
    	int count = 0;	//カウントの初期化
    	Set<String> checkHash = new HashSet<String>();
    	for(String str : yourHand) { //手札の枚数文ループ
	/*
	 * checkHashの中にstrが存在している場合、重複カウントをインクリメントする。
	 * 重複がなければその文字をcheckHashの中に格納する。
	 * 
	 */
    		if(checkHash.contains(str)) { 
    			count ++;
    		} else {
    			checkHash.add(str);
    		}
    	}
    	
    	//以下、重複の数で完成した役を判定する。
    	//ツーペアとスリーカードの判定は少々ややこしいので無理やり別メソッドで判定。
        //何かいい方法あったら教えてください…
    	switch (count) {
    	case(0):
    		if(checkHash.contains("*")) {
    			System.out.println("OnePair");
    			break;
    		} else {
    			System.out.println("NoPair");
    			break;
    		}
    	case(1):
    		if(checkHash.contains("*")) {
    			System.out.println("ThreeCard");
    			break;
    		} else {
    			System.out.println("OnePair");
    			break;
    		}
    	case(2):
    		if(checkHash.contains("*")) {
    			System.out.println("FourCard");
    			break;
    		} else if (checkHash.size() == 2){
    			twoPairOrThreeCard(yourHand);
    			break;
    		} else {
    			System.out.println("ThreeCard");
    			break;
    		}
    	case(3):
    		System.out.println("FourCard");
    		break;
    	}
    }

    /*
     * 手札の1番目の要素と2~4番目の各要素が等しいか比較。
     *3回の比較の中でどれか1回だけ等し買ったときはツーペア、それ以外はスリーカードになる。 
     */
    public static void twoPairOrThreeCard(String[] yourHand) {
    	int elementCount = 0;
    	for(int i = 1;i < yourHand.length;i ++ ) {
    		if(yourHand[0].equals(yourHand[i])) {
    			elementCount++;
    		}
    	}
    	if(elementCount == 1) {
    		System.out.println("TwoPair");
    	} else {
    		System.out.println("ThreeCard");
    	}
    }
}


配列の要素内に特定の要素がいくつあるかをカウントしたい場合はこのやり方でうまくいくはず。