Мне нужно написать программу, которая должна читать файл для анаграмм и показывать слово + его анаграммы. Txt файлы очень большие, после использования сканера, размер listOfWords является: 25000.Поиск анаграммы с Java 8
Выходной пример:
word anagram1 anagram2 anagram3 ...
word2 anagram1 anagram2...
У меня есть код, он работает, но очень медленно:
private static List<String> listOfWords = new ArrayList<String>();
private static List<ArrayList<String>> allAnagrams = new ArrayList<ArrayList<String>>();
public static void main(String[] args) throws Exception {
URL url = new URL("www.xxx.pl/textFile.txt");
Scanner scanner = new Scanner(url.openStream());
while (scanner.hasNext()) {
String nextToken = scanner.next();
listOfWords.add(nextToken);
}
scanner.close();
while (listOfWords.isEmpty() == false) {
ArrayList<String> anagramy = new ArrayList<String>();
String wzor = listOfWords.remove(0);
anagramy.add(wzor);
char[] ch = wzor.toCharArray();
Arrays.sort(ch);
for (int i = 0; i < listOfWords.size(); i++) {
String slowo = listOfWords.get(i);
char[] cha = slowo.toCharArray();
Arrays.sort(cha);
if (Arrays.equals(ch, cha)) {
anagramy.add(slowo);
listOfWords.remove(i);
i--;
}
}
allAnagrams.add(anagramy);
}
for (ArrayList<String> ar : allAnagrams) {
String result = "";
if (ar.size() > 1) {
for (int i = 1; i < ar.size(); i++) {
result = ar.get(i) + " ";
}
System.out.println(ar.get(0) + " " + result);
}
}
}
Я должен пишите его с Java 8 - потоками, но я не знаю. Можно использовать Streams для чтения из URL + поисковых анаграмм? Не могли бы вы помочь мне в поиске анаграмм Stream? Учитель сказал мне, что код должен быть короче, чтобы мой читал весь список. Это возможно только в нескольких строках?
Действительно? 'Stream.of (ДЕЛЕНИЕ (""))'? Несмотря на то, что вы используете 'Pattern.splitAsStream' в том же ответе? Не говоря уже о * намного более эффективном 's.codePoints(). Sorted() .collect (StringBuilder :: new, StringBuilder :: appendCodePoint, StringBuilder :: append) .toString();'. Хотя использование 'char [] a = s.toCharArray(); Arrays.sort (а); return String.valueOf (a); 'может быть более простым выбором здесь. – Holger
Хорошая работа, не могли бы вы сказать мне, где я могу добавить свою собственную реализацию сортировки, которая будет сортировать анаграммы (без первого слова)? – Khalos
@ Holger, никто не задавал наиболее эффективное решение, было запрошено только решение на основе Stream API. Если у вас есть проблемы с производительностью, вы не должны использовать потоки в первую очередь (кстати, в этом случае использование 'CharBuffer.wrap (a)' как ключа, вероятно, более эффективно). Если вы просто хотите Stream API, то мое решение определенно короче и понятнее, чем ваши альтернативы. –