filebot/source/net/filebot/similarity/SimilarityComparator.java

47 lines
1.3 KiB
Java
Raw Normal View History

2014-04-19 02:30:29 -04:00
package net.filebot.similarity;
2016-02-08 17:29:45 -05:00
import static java.util.Collections.*;
2016-02-08 17:29:45 -05:00
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
2016-02-08 17:29:45 -05:00
import java.util.function.Function;
2016-02-08 17:29:45 -05:00
public class SimilarityComparator<T, P> implements Comparator<T> {
2015-07-25 18:47:19 -04:00
2016-02-27 00:22:46 -05:00
public static <T, S extends CharSequence> SimilarityComparator<T, S> compareTo(S value, Function<T, S> mapper) {
return new SimilarityComparator<T, S>(new NameSimilarityMetric(), singleton(value), mapper.andThen(Collections::singleton));
}
2012-02-22 03:30:50 -05:00
protected SimilarityMetric metric;
2016-02-08 17:29:45 -05:00
protected Collection<P> paragon;
2015-07-25 18:47:19 -04:00
2016-02-08 17:29:45 -05:00
protected Function<T, Collection<P>> mapper;
2015-07-25 18:47:19 -04:00
2016-02-08 17:29:45 -05:00
public SimilarityComparator(SimilarityMetric metric, Collection<P> paragon, Function<T, Collection<P>> mapper) {
this.metric = metric;
this.paragon = paragon;
2016-02-08 17:29:45 -05:00
this.mapper = mapper;
}
2015-07-25 18:47:19 -04:00
@Override
2016-02-08 17:29:45 -05:00
public int compare(T o1, T o2) {
return Double.compare(getSimilarity(o2), getSimilarity(o1));
}
2015-07-25 18:47:19 -04:00
2016-02-08 17:29:45 -05:00
private static final double ZERO = 0;
2015-07-25 18:47:19 -04:00
2016-02-08 17:29:45 -05:00
public double getSimilarity(T value) {
return paragon.stream().mapToDouble((it) -> accumulateSimilarity(it, value)).average().orElse(ZERO);
}
2015-07-25 18:47:19 -04:00
2016-02-08 17:29:45 -05:00
private double accumulateSimilarity(P paragon, T value) {
if (paragon == null) {
return ZERO;
2012-02-22 03:30:50 -05:00
}
2016-02-08 17:29:45 -05:00
return mapper.apply(value).stream().mapToDouble((it) -> it == null ? ZERO : (double) metric.getSimilarity(paragon, it)).max().orElse(ZERO);
2012-02-22 03:30:50 -05:00
}
2016-02-08 17:29:45 -05:00
}