static L scoredSearch2(int maxResults, S query, Iterable data) { new MultiMap map; L prepared = scoredSearch_prepare(query); for (S s : data) { int score = scoredSearch_score(s, prepared); if (score == 0) continue; map.put(score, s); } new L out; for (int score : keysDesc(map)) { if (l(out) >= maxResults) break; int need = maxResults-l(out); out.addAll(takeFirst(need, map.get(score))); } ret out; }