#java #java-io
Вопрос:
Я использовал следующий код, чтобы прочитать все строки. Теперь, как я понимаю, я должен каким-то образом проанализировать числа из каждой строки и применить функцию, чтобы получить максимальное значение. Проблема в том, что я не знаю, как это сделать, и я не знаю, что искать в Google. Проблема заключается в неизвестных неизвестных. Некоторые указания были бы полезны.
import java.io.IOException;
import java.util.List;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.util.ArrayList;
public class KnowNotTest1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
System.out.println("Using Path.readAllLines()");
try{
List<String> fileData = Files.readAllLines(Paths.get("files\b.txt"));
fileData.forEach(System.out::println);
}
catch (IOException e){
System.out.println(e);
}
}
}
Текстовый файл, который я читаю, выглядит следующим образом:
10,11,12
2,13
33,22,1,1
1
И ожидаемый результат будет:
12
13
33
1
Комментарии:
1. Посмотрите на
split()
включенную функциюString
и наInteger.parseInt()
функцию.2. Итак, у вас есть линии, может быть, вам следует разделить линии? Просмотрите результат, отслеживая максимум.
3. После прочтения каждой строки поместите эту строку в строку и используйте String.split() , он вернет тип массива, а затем вы можете просмотреть этот массив и сравнить каждый элемент, пока не найдете самый большой.
Ответ №1:
Без проверки правильности входного файла
readAllLines(Paths.get("/tmp/lines.txt")).stream()
.mapToInt(s -> Arrays.stream(s.split(","))
.mapToInt(Integer::parseInt).max().getAsInt())
.forEach(System.out::println);
предыдущий вариант лучше всего выполнять не напрямую (есть три важные и несвязанные части: чтение, вычисление и отчет), кроме того, он открывает двери для эффективной потоковой обработки в режиме онлайн ( readAllLines
разбейте его).
Императивным способом является
for(String line: readAllLines(Paths.get("/tmp/lines.txt"))) {
int max = Integer.MIN_VALUE;
for (String word : line.split(","))
max = Math.max(max, Integer.parseInt(word));
System.out.println(max);
}
но соединяется и не сочиняется.
Комментарии:
1. Как, черт возьми, это приносит пользу оператору? Ты вообще думаешь, что он это понимает?
2. Самое важное и лучшее, что учитель может сделать для своего ученика, — это заставить его задуматься. Если ему действительно интересно, мой ответ останется в его памяти. И он научится.
3. Может быть, вы и правы, но, с другой стороны, может быть, он просто скопирует-макароны…
4. Может быть, но если он этого не поймет, его учитель все равно укажет ему на это. (Я все равно обновил свой ответ, хотя он содержит копию/вставляемую версию…)
5. Я уточняю. Сложное выражение заставляет вас понимать и тренировать свой ум, легкое выражение-нет, потому что оно «тривиально понятно», и ваш ум не приложил никаких усилий. Моя дочь совершенно нормальна (у нее нет особых способностей), но в 10 лет и просто играя, она осваивает неродной язык (английский) и алгебру. Весь фокус в том, чтобы заставить ее задуматься. Если вы будете обращаться с ними как с младенцами, они будут младенцами всю свою жизнь.
Ответ №2:
Используйте метод mapToXX потокового api :
public class KnowNotTest1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
System.out.println("Using Path.readAllLines()");
try{
List<String> fileData = Files.readAllLines(Paths.get("files\b.txt"));
System.out.println("Input: ");
fileData.forEach(System.out::println);
System.out.println("Output: ");
fileData.stream()
.mapToLong(
s -> Arrays.stream(s.split(","))
.mapToLong(Long::parseLong).max()
.getAsLong()).forEach(System.out::println);
}
catch (IOException e){
System.out.println(e);
}
}