Прочитайте значения, разделенные запятыми, из текстового файла на Java и найдите максимальное число в каждой строке

#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);
    }
}