集合(java.util.Set)の使い方
卒研の学生さんに参照してもらうためのプログラム.
import java.util.HashSet; import java.util.Set; import java.util.Iterator; //集合(Set)の使い方 // //2つの語集合間の類似度として Jaccard 係数を用いる例. //Jaccard 係数については,例えば http://www11.atwiki.jp/kenichiro/pages/100.html を参照. // //(注) 本プログラムは,学生へ提示するプログラム例として作成しているため,あえて冗長な記述を含む. public class SetSample { public static void main(String[] args) { //セット(集合)オブジェクトの生成 Set<String> setA = new HashSet<String>(); Set<String> setB = new HashSet<String>(); //各セットに要素を追加 setA.add("ABC"); setA.add("DEF"); setA.add("GHI"); setA.add("ABC"); //登録済みの要素と同じものを登録しても2重にカウントしない. setB.add("ABC"); setB.add("DEF"); setB.add("JKL"); //各セットの要素数を出力 System.out.println("size of setA = " + setA.size()); // 3が出力される System.out.println("size of setB = " + setB.size()); // 3が出力される //セット内の全要素を得るには Iterator を用いる. //例示として setA に含まれる要素を得て表示してみる. Iterator<String> iter; iter = setA.iterator(); while(iter.hasNext()){ String element = iter.next(); System.out.println(element); } //2つの集合を比較し,類似度を求める. //積集合(共通集合)を作る //(注) setA.retainAll(setB)とすると,setA の当初の状態が崩れるため,予め intersection へコピーする. Set<String> intersection = new HashSet<String>(setA); //setA を intersection へコピー intersection.retainAll(setB); //積集合 System.out.println("size of intersetion = " + intersection.size()); // 2が出力される //和集合を作る Set<String> union = new HashSet<String>(setA); //setA を union へコピー union.addAll(setB); //和集合 System.out.println("size of union = " + union.size()); // 4が出力される //類似度(Jaccard係数) = |A cap B| / |A cup B| double similarity = (double)intersection.size() / union.size(); System.out.println("similarity = " + similarity); } }