Ну, здесь есть пара проблем.Если бы вы запустили свой код, вы бы получили IndexOutOfBoundException
в doIt()
, потому что ваш список allStrings
пуст и, следовательно, когда вы звоните String shortest = allStrings.get(0);
, вы вызываете что-то, чего нет в вашем списке.
Кроме того, логика if(s.length()>shortest.length()))
немного странная, поскольку по сути вы действительно сравниваете только строки в вашем списке, а не с тем, что вы прочитали из файла.Следовательно, вы никогда не определите, является ли строка, которую вы прочитали из файла, на меньше , чем любая из строк, которые у вас уже есть.
Наконец, этот код ... for (String text: allStrings) {w.println(text); }
... для записи вашего файла находится в цикле, следовательно, вы записываете String каждую итерацию цикла.
Вам не нужна переменная Самые короткие , просто используйте логическое значение, чтобы указать, является ли строка, в которой вы читаете, короче, чем те, которые уже есть в вашем списке, и только если она есть, добавьтеэто к вашему списку.
public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
List<String> shortestStrings = new ArrayList<>();
String line = r.readLine();
shortestStrings.add(line);
while(line != null) {
boolean isShortert = Boolean.TRUE;
for(String s: shortestStrings) {
if(line.length() > s.length()) {
isShortert = Boolean.FALSE;
}
}
if(isShortert) {
shortestStrings.add(line);
}
line = r.readLine();
}
for (String text: shortestStrings) {
w.println(text);
}
}