Я написал код, который запускает список строк и возвращает список наименее часто встречающихся символов во всем списке строк.
Какой самый быстрый способ вернуть список слова отсортированы по первым наименее часто встречающимся символам? (Я работаю с огромным списком строк, поэтому написанный мною код работает недостаточно быстро. Пример ниже приведен только для примера)
Например, если задан список: ["hello", "my", "name", "is", "inigo", "montoya", "you", "killed", "my", "father", "prepare", "to", "die"]
. Мой код возвращает: [s, g, u, k, f, h, d, p, n, t, r, l, m, y, a, i, o, e]
, где s
- наименее часто встречающаяся буква в списке строк, а e
- наиболее часто встречающаяся буква в списке. Результирующий список будет затем возвращать слова, содержащие наименее часто встречающиеся буквы, и так далее. Например: ["is", "inigo", "you", "killed", "father", "hello", "die", "prepare", "name", "montoya", "to", "my"]
Вот мой код, который находит наименее часто встречающиеся буквы:
public static void method(List<String> words)
{
Map<Character, Integer> elemCount = new LinkedHashMap<>();
for (String word : words)
{
for (int i = 0; i < word.length(); i++)
{
if (elemCount.containsKey(word.charAt(i)))
{
elemCount.put(word.charAt(i), elemCount.get(word.charAt(i)) + 1);
}
else
{
elemCount.put(word.charAt(i), 1);
}
}
}
ArrayList<Character> sortedElems = new ArrayList<>();
LinkedList<String> sorted = new LinkedList<>();
elemCount.entrySet().stream().sorted(
Map.Entry.comparingByValue()).forEach(entry ->
{
for (int i = 1; i <= entry.getValue(); i++)
{
if (sortedElems.contains(entry.getKey()) == false)
{
sortedElems.add(entry.getKey());
}
}
}
);
А вот код, в котором я пытаюсь отсортировать по наименее частым символам, найденным в строка:
for (int i = 0; i < sortedElems.size(); i++)
{
for (String word : words)
{
char x = sortedElems.get(i);
CharSequence c = x + "";
if (word.contains(c) == true && sorted.contains(word) == false)
{
sorted.add(word);
}
}
}
System.out.println(sorted);