Link to code: BruteAutocomplete.java
import java.util.PriorityQueue;
/**
* Implements Autocompletor by scanning through the entire array of terms for every topKMatches or
* topMatch query.
*/
public class BruteAutocomplete implements Autocompletor {
Term[] myTerms;
public BruteAutocomplete(String[] terms, double[] weights) {
if (terms == null || weights == null)
throw new NullPointerException("One or more arguments null");
myTerms = new Term[terms.length];
for (int i = 0; i < terms.length; i++) {
myTerms[i] = new Term(terms[i], weights[i]);
}
}
@Override
public String[] topKMatches(String prefix, int k) {
// maintain pq of size k
PriorityQueue<Term> pq = new PriorityQueue<Term>(k, new Term.WeightOrder());
for (Term t : myTerms) {
if(!t.getWord().startsWith(prefix)) continue;
if (pq.size() < k) {
pq.add(t);
} else if (pq.peek().getWeight() < t.getWeight()) {
pq.remove();
pq.add(t);
}
}
int numResults = Math.min(k, pq.size());
String[] ret = new String[numResults];
for (int i = 0; i < numResults; i++) {
ret[numResults - 1 - i] = pq.remove().getWord();
}
return ret;
}
@Override
public String topMatch(String prefix) {
String maxTerm = "";
double maxWeight = -1;
for (Term t : myTerms) {
if (t.getWeight() > maxWeight && t.getWord().startsWith(prefix)) {
maxTerm = t.getWord();
}
}
return maxTerm;
}
}