public <S> boolean equalsIgnoreOrder(Nfa<S> nfa1, Nfa<S> nfa2) { return equalsIgnoreOrder(nfa1, nfa2, new Function<S, Object>() { public Object apply(S from) { return from; } }); }
public <S> boolean equalsIgnoreOrder(Nfa<S> nfa1, Nfa<S> nfa2) { return equalsIgnoreOrder(nfa1, nfa2, new Function<S, Object>() { @Override public Object apply(S from) { return from; } }); }
@Override public boolean equals(Object obj) { if (obj == null || obj.getClass() != getClass()) return false; return new NfaUtil().equalsIgnoreOrder(this, (SerializerPDA) obj); }
public <S> boolean equalsIgnoreOrder(Nfa<S> nfa1, Nfa<S> nfa2, S s1, S s2, Function<S, ? super Object> keyFunc, Set<S> visited) { if (!visited.add(s1)) return true; Iterable<S> followers1 = nfa1.getFollowers(s1); Iterable<S> followers2 = nfa1.getFollowers(s2); if (Iterables.size(followers1) != Iterables.size(followers2)) return false; Multimap<? super Object, S> index = Multimaps.index(followers1, keyFunc); for (S f : followers2) { Object key2 = keyFunc.apply(f); Collection<S> key1s = index.get(key2); if (key1s.size() != 1) return false; if (!equalsIgnoreOrder(nfa1, nfa2, key1s.iterator().next(), f, keyFunc, visited)) return false; } return true; }
public <S> boolean equalsIgnoreOrder(Nfa<S> nfa1, Nfa<S> nfa2, Function<S, ? extends Object> keyFunc) { if (nfa1 == nfa2) return true; if (!Objects.equal(keyFunc.apply(nfa1.getStart()), keyFunc.apply(nfa2.getStart()))) return false; return equalsIgnoreOrder(nfa1, nfa2, nfa1.getStart(), nfa2.getStart(), keyFunc, Sets.<S> newHashSet()); }
public <S> boolean equalsIgnoreOrder(Nfa<S> nfa1, Nfa<S> nfa2, S s1, S s2, Function<S, ? extends Object> keyFunc, Set<S> visited) { if (!visited.add(s1)) return true; Iterable<S> followers1 = nfa1.getFollowers(s1); Iterable<S> followers2 = nfa1.getFollowers(s2); if (Iterables.size(followers1) != Iterables.size(followers2)) return false; Map<Object, S> index = Maps.newHashMap(); for (S f1 : followers1) if (index.put(keyFunc.apply(f1), f1) != null) return false; for (S f : followers2) { Object key2 = keyFunc.apply(f); S key1s = index.get(key2); if (key1s == null || !equalsIgnoreOrder(nfa1, nfa2, key1s, f, keyFunc, visited)) return false; } return true; }
public <S> boolean equalsIgnoreOrder(Nfa<S> nfa1, Nfa<S> nfa2, Function<S, ? super Object> keyFunc) { if (!Objects.equal(keyFunc.apply(nfa1.getStart()), keyFunc.apply(nfa2.getStart()))) return false; return equalsIgnoreOrder(nfa1, nfa2, nfa1.getStart(), nfa2.getStart(), keyFunc, Sets.<S> newHashSet()); }