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 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;
}
}
使用法は以下のようになります。以下の例では、Stringのリストの要素を小文字に変換したのものをキーとして利用し、重複を検出します。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() {
Multimap duplications = 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);
}
}
コメント