protected <S> void collectedInverseMap(Nfa<S> nfa, S state, Map<S, List<S>> inverseMap, Set<S> visited) { if (!visited.add(state)) return; for (S follower : nfa.getFollowers(state)) { List<S> inverse = inverseMap.get(follower); if (inverse == null) inverseMap.put(follower, inverse = Lists.newArrayList()); inverse.add(state); collectedInverseMap(nfa, follower, inverseMap, visited); } }
protected <S> void collectedInverseMap(Nfa<S> nfa, S state, Map<S, List<S>> inverseMap, Set<S> visited) { if (!visited.add(state)) return; for (S follower : nfa.getFollowers(state)) { List<S> inverse = inverseMap.get(follower); if (inverse == null) inverseMap.put(follower, inverse = Lists.newArrayList()); inverse.add(state); collectedInverseMap(nfa, follower, inverseMap, visited); } }
public <S> Nfa<S> inverse(Nfa<S> nfa) { Map<S, List<S>> inverseMap = Maps.newHashMap(); collectedInverseMap(nfa, nfa.getStart(), inverseMap, Sets.<S> newHashSet()); return new NFAImpl<S>(nfa.getStop(), nfa.getStart(), inverseMap); }
public <S> Nfa<S> inverse(Nfa<S> nfa) { Map<S, List<S>> inverseMap = Maps.newLinkedHashMap(); collectedInverseMap(nfa, nfa.getStart(), inverseMap, Sets.<S> newHashSet()); return new NFAImpl<S>(nfa.getStop(), nfa.getStart(), inverseMap); }