package org.gbif.checklistbank.utils; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.Map; import java.util.Set; /** * A boolean matrix with values defaulting to false. * The matrix is an indentiy matrix and symmetric. */ public class SymmetricIdentityMatrix<T> { private Map<T, Set<T>> matches = Maps.newHashMap(); private SymmetricIdentityMatrix() { } public static <T> SymmetricIdentityMatrix<T> create() { return new SymmetricIdentityMatrix<T>(); } public void add(T val1, T val2) { if (!matches.containsKey(val1)) { matches.put(val1, Sets.newHashSet()); } matches.get(val1).add(val2); } public void remove(T val) { matches.remove(val); for (Set<T> vals : matches.values()) { vals.remove(val); } } /** * Check if 2 values in the matrix exist or are identical. * @param val1 * @param val2 * @return true if values are identical or have an entry in the symmetric matrix */ public boolean contains(T val1, T val2) { return val1.equals(val2) || matches.containsKey(val1) && matches.get(val1).contains(val2) || matches.containsKey(val2) && matches.get(val2).contains(val1); } }