Следующий фрагмент должен быть поучительным:
import java.util.*;
//...
String text1 = "saqartvelo gabrwyindeba da gadzlierdeba aucileblad";
String text2 = "saqartvelo gamtliandeba da gadzlierdeba aucileblad";
List<String> common = new ArrayList<String>();
for (String s1 : text1.split(" ")) {
for (String s2 : text2.split(" ")) {
if (s1.equals(s2)) {
common.add(s1);
}
}
}
Collections.sort(common, new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return s2.length() - s1.length();
}
});
System.out.println(common);
// prints "[gadzlierdeba, saqartvelo, aucileblad, da]"
Ключевые идеи:
Смежные вопросы
Альтернативное решение
Обратите внимание, что вышеприведенное решение - O(N^2)
, поскольку оно проверяет каждую пару слов, чтобы увидеть, равны ли они Это означает, что он плохо масштабируется, когда в двух текстах много слов. Используя Set
, например HashSet
, вы можете сделать это в ожидаемое время O(N)
, используя Set.retainAll
для вычисления пересечения двух множеств.
static Set<String> wordSet(String text) {
return new HashSet<String>(Arrays.asList(text.split(" ")));
}
//...
String text1 = ...;
String text2 = ...;
Set<String> commonSet = wordSet(text1);
commonSet.retainAll(wordSet(text2));
List<String> common = new ArrayList<String>(commonSet);
System.out.println(common);
// prints "[da, aucileblad, saqartvelo, gadzlierdeba]"
// in no particular order
// sort by string length using Comparator as above