Collection内の重複を見つけるJavaコードをGoogleのMultimapを使って書いてみました。
引数のkeyGeneratorによって、重複したとみなす要素の戦略を変更できます。実装にMapを使っていますので、keyGegerator関数で生成されるKeyオブジェクトは、equalsメソッドとhashCodeメソッドが正しく実装されている必要があります。
引数のkeyGeneratorによって、重複したとみなす要素の戦略を変更できます。実装にMapを使っていますので、keyGegerator関数で生成されるKeyオブジェクトは、equalsメソッドとhashCodeメソッドが正しく実装されている必要があります。
import java.util.Collection; import java.util.Map.Entry; import com.google.common.base.Function; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; public class DuplicationFinder { public static使用法は以下のようになります。以下の例では、Stringのリストの要素を小文字に変換したのものをキーとして利用し、重複を検出します。Multimap findDuplication(Collection c, Function keyGenerator){ return toResult(createMultimap(c, keyGenerator)); } private static Multimap toResult(final Multimap temp) { final Multimap result = ArrayListMultimap.create(); for(Entry > entry : temp.asMap().entrySet()){ if(entry.getValue().size() > 1){ result.putAll(entry.getKey(), entry.getValue()); } } return result; } private static Multimap createMultimap(Collection c, Function keyGenerator) { final Multimap map = ArrayListMultimap.create(); for(V v : c){ map.put(keyGenerator.apply(v), v); } return map; } }
import java.util.Arrays; import org.junit.Assert; import org.junit.Test; import com.google.common.base.Function; import com.google.common.collect.Multimap; public class DuplicationFinderTest { @Test public void shouldFindDuplication() { Multimapduplications = DuplicationFinder.findDuplication( Arrays.asList("A", "B", "C", "a", "a", "B"), new Function () { @Override public String apply(String src) { return src.toLowerCase(); } }); Assert.assertEquals(duplications.keySet().size(), 2); Assert.assertEquals(duplications.get("a").size(), 3); Assert.assertEquals(duplications.get("b").size(), 2); } }
コメント