今回はJavaのコレクションの中の一つSetにフォーカスして演習してみよう。
この記事の対象者
JavaでSet(集合)を学んで「こんなの何に使うんだろう?」と感じている人
お題
サイコロを指定回数振って、それがゾロ目かどうかを出力する処理を作成せよ。
[実行例] 何回ふる>>5 5 3 6 3 4 ゾロ目ではありません
何回ふる>>3 2 2 2 ゾロ目です
ポイント解説
ゾロ目というのは言い方を変えれば出た目が1種類ということだ。
この種類を扱う場合にSetを活用するとよい。
解答例
import java.util.*;
public class Set1{
public static void main(String[] args){
Random rand=new Random();
Scanner sc =new Scanner(System.in);
Set<Integer> dices=new HashSet<>();
System.out.print("何回ふる>>");
int count=sc.nextInt();
for(int i=0;i<count;i++){
int dice=rand.nextInt(6)+1;
System.out.println(dice);
dices.add(dice);
}
if(dices.size()==1){
System.out.println("ゾロ目です");
}else{
System.out.println("ゾロ目ではありません");
}
sc.close();
}
}
お題
サイコロを繰り返し振って、1-6の目すべてが出揃うまでの回数を出力せよ
[実行例] サイコロを繰り返しふります 4 4 2 2 3 3 2 1 6 3 1 1 3 6 5 15回で揃いました
ポイント解説
繰り返し振って出ためが6種類になったらループを抜ければよい。Setの出番
解答例
import java.util.*;
public class Set2{
public static void main(String[] args){
Random rand=new Random();
Set<Integer> dices=new HashSet<>();
System.out.println("サイコロを繰り返しふります");
int count=0;
while(true){
count++;
int dice=rand.nextInt(6)+1;
System.out.println(dice);
dices.add(dice);
if(dices.size() == 6){
break;
}
}
System.out.println(count+"回で揃いました");
sc.close();
}
}
お題
1-10のランダムな数値を10個作成し、その出目の種類を昇順に出力せよ。
[実行例] 1-10のランダムな値を10個生成します。 [1, 6, 3, 9, 3, 6, 10, 10, 8, 7] 出目の種類を昇順に表示します [1, 3, 6, 7, 8, 9, 10]
ポイント解説
Set<Integer>を作成する際に、コンスタラクタの引数にList<Integer>を渡すと、重複を削除したSetを作成することができる。この際、TreeSetを用いると自然順序(整数だったら昇順)に並び替える
解答例
import java.util.*;
public class Set3{
public static void main(String[] args){
Random rand=new Random();
Set<String> dices=new HashSet<>();
System.out.println("1-10のランダムな値を10個生成します。");
List<Integer> allData=new ArrayList<>();
for(int i=0;i<10;i++){
allData.add(rand.nextInt(10)+1);
}
System.out.println(allData);
System.out.println("出目の種類を昇順に表示します");
Set<Integer> setData=new TreeSet<>(allData);
System.out.println(setData);
}
}
お題
お寿司で食べた種類を食べた順に出力する処理を作成せよ。以下のCSVデータをコピペして使うこと
String dataCSV="タコ,イクラ,マグロ,トロ,イクラ,ウニ,ホタテ,マグロ,トロ,マグロ,エビ,イカ";
[実行例] 今日食べたお寿司 タコ イクラ マグロ トロ イクラ ウニ ホタテ マグロ トロ マグロ エビ イカ 食べた種類を食べた順に表示します(重複除く) [タコ, イクラ, マグロ, トロ, ウニ, ホタテ, エビ, イカ]
ポイント解説
カンマ区切りのcsvデータをsplitして配列にした後、Listに変換し、それをSetのコンストラクタの引数に指定するとよい。その際、LinkedHashSetを用いると格納順番を保持できる。重複削除というキーワードが出てきたらSetの出番。
解答例
import java.util.*;
public class Set4{
public static void main(String[] args){
String dataCSV="タコ,イクラ,マグロ,トロ,イクラ,ウニ,ホタテ,マグロ,トロ,マグロ,エビ,イカ";
String[] data=dataCSV.split(",");
System.out.println("今日食べたお寿司");
for(String sushi:data){
System.out.println(sushi);
}
System.out.println("食べた種類を食べた順に表示します(重複除く)");
List<String> list=Arrays.asList(data);
Set<String> set =new LinkedHashSet<>(list);
System.out.println(set);
}
}
コメント