WordNet.java
package cn.denghanxi.assignment.s42;
import edu.princeton.cs.algs4.Digraph;
import edu.princeton.cs.algs4.In;
import java.util.*;
public class WordNet {
private Set<String> synsetsSet;
private Map<Integer, Set<String>> keyToValue;
private Map<String, Set<Integer>> valueToKey;
private Digraph digraph;
public WordNet(String synsets, String hypernyms) {
synsetsSet = new HashSet<>();
keyToValue = new HashMap<>();
valueToKey = new HashMap<>();
In synsetsIn = new In(synsets);
while (true) {
String inLine = synsetsIn.readLine();
if (inLine == null) break;
String[] ss = inLine.split(",");
int key = Integer.parseInt(ss[0]);
String[] values = ss[1].split(" ");
Set<String> valuesSet = new HashSet<>();
valuesSet.addAll(Arrays.asList(values));
keyToValue.put(key, valuesSet);
for (String s : values) {
valueToKey.computeIfAbsent(s, s1 -> {Set<Integer> set = new HashSet<>(); valueToKey.put(s1, set);return set;});
Set<Integer> set = valueToKey.get(s);
set.add(key);
synsetsSet.add(s);
}
}
digraph = new Digraph(keyToValue.size());
In hypernymsIn = new In(hypernyms);
while (true) {
String inLine = hypernymsIn.readLine();
if (inLine == null) break;
String[] ss = inLine.split(",");
for (int i = 1 ; i < ss.length; i++) {
digraph.addEdge(Integer.parseInt(ss[0]), Integer.parseInt(ss[i]));
}
}
}
public Iterable<String> nouns() {
return synsetsSet;
}
public boolean isNoun(String word) {
if (word == null) throw new IllegalArgumentException("null");
return synsetsSet.contains(word);
}
public int distance(String nounA, String nounB) {
if (!isNoun(nounA) || !isNoun(nounB)) throw new IllegalArgumentException("not exist");
SAP sap = new SAP(digraph);
Set<Integer> sourceA = valueToKey.get(nounA);
Set<Integer> sourceB = valueToKey.get(nounB);
return sap.length(sourceA, sourceB);
}
public String sap(String nounA, String nounB) {
if (!isNoun(nounA) || !isNoun(nounB)) throw new IllegalArgumentException("not exist");
SAP sap = new SAP(digraph);
Set<Integer> sourceA = valueToKey.get(nounA);
Set<Integer> sourceB = valueToKey.get(nounB);
int ancestorKey = sap.ancestor(sourceA, sourceB);
return keyToValue.get(ancestorKey).iterator().next();
}
public static void main(String[] args) {
}
}