// Агрегируем
HashMap<Set<String>, TreeSet<Integer>> results = new HashMap<Set<String>, TreeSet<Integer>>();
HashMap<String, TreeSet<Integer>> groups_copy = new HashMap<String, TreeSet<Integer>>(groups);
Iterator<Entry<String, TreeSet<Integer>>> iter = groups_copy.entrySet().iterator();
while(iter.hasNext()) {
Entry<String, TreeSet<Integer>> ge = iter.next();
iter.remove();
groups_copy.forEach((k,v) -> {
TreeSet<String> key = new TreeSet<String>();
key.add(ge.getKey());key.add(k);
TreeSet<Integer> val = new TreeSet<Integer>();
if(ge.getValue().size() > v.size() ) {
val.addAll(ge.getValue());
val.retainAll(v);
} else {
val.addAll(v);
val.retainAll(ge.getValue());
}
if(val.size() >0)
results.put(key, val);
});
}
Просто, то ли Вы что-то не понимаете в условии задачи, то ли я. Группа - это множество пересекающихся пар (но повторов может быть больше 2) элементов строк (вы их называете термами, как я понял).
"F;I;J",
"F;X;A",
"X;D;P",
@MaxLich, По вашему выводу нельзя восстановить строки и вывести их в таком виде, как я указал.
// выводим результат
for(Entry<String, TreeSet<Integer>> group: groups.entrySet()) {
if(group.getValue().size() >1)
System.out.printf("Группа: %s\n", group.getKey().toString());
group.getValue().forEach((i)->System.out.println(myData[i]));
}