Как получить максимальные и минимальные значения из файла CSV в Java - PullRequest
0 голосов
/ 13 марта 2019

Вот мой CSV-файл: marks.csv, он содержит номер студента слева и метки справа:

B00123,55
B00783,35
B00898,67

Мне нужно иметь возможность искать в этом файле и находить максимальную оценку и минимальную оценку. У меня есть этот код, который возвращает значения, но я не знаю, что делать потом:

public static void MaxAndMin()
{
  // .csv files are comma separated
  String fileName = "src\\data\\marks.csv";
  File file = new File(fileName);

  try 
  {
      Scanner inputStream = new Scanner(file);

      while(inputStream.hasNext())
      {
          String data = inputStream.next();
          String [] values = data.split(",");
          int mark = Integer.parseInt(values[1]);
          System.out.println(mark);      
      }

      inputStream.close();

  } 
  catch (FileNotFoundException ex) 
  {
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
  }
}

И это возвращает следующее:

 55
 35
 67

Не знаю, куда идти дальше, любая помощь приветствуется! Спасибо!

Ответы [ 4 ]

2 голосов
/ 13 марта 2019

Короче, яснее и менее подробный ответ на это может быть следующим:

private static void minAndMax() {
    try (Stream<String> stream = Files.lines(Paths.get(FILE_PATH))) {
        IntSummaryStatistics statistics = stream
            .map(s -> s.split(",")[1])
            .mapToInt(Integer::valueOf)
            .summaryStatistics();
        System.out.println("Lowest:: " + statistics.getMin());
        System.out.println("Highest:: " + statistics.getMax());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Просто прочитайте строки файла, откройте Stream<String>, сопоставьте и разделите его на запятую, сопоставьте с Integer и создайте из него объект IntSummaryStatistics. Затем просто используйте значения getMin и getMax. Чисто и просто. Также обратите внимание, что в этом ответе используется попытка использования ресурсов для автоматического управления различными действиями, которые могут потребовать ручной обработки.

1 голос
/ 13 марта 2019
public static void MaxAndMin()
                {
                    // .csv files are comma separated
                    String fileName = "src\\data\\marks.csv";
                    File file = new File(fileName);
                    TreeSet<Integer> ts1 = new TreeSet<Integer>(); 
                    try 
                    {
                        Scanner inputStream = new Scanner(file);

                        while(inputStream.hasNext())
                        {
                            String data = inputStream.next();
                            String [] values = data.split(",");
                            int mark = Integer.parseInt(values[1]);
                            ts1.add(mark);     
                        }


                        inputStream.close();

                        System.out.println("Min Marks"+ts1.first());
                        System.out.println("Max Marks"+ts1.last());
                    } 
                    catch (FileNotFoundException ex) 
                    {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

Вы можете сохранить значения в Treeset, а затем получить первый и последний элемент. Treeset хранит элемент в отсортированном порядке.

0 голосов
/ 13 марта 2019

Вы можете сделать что-то вроде этого, имейте в виду, что я использовал потоки целых чисел в Java 8, чтобы найти минимальное и максимальное значения из списка:

    public static void maxAndMin() {
    // .csv files are comma separated
    String fileName = "src\\data\\marks.csv";
    File file = new File(fileName);

    try(Scanner inputStream = new Scanner(file)) {
        ArrayList<Integer> listNumbers = new ArrayList<>();

        while(inputStream.hasNext()) {
            String data = inputStream.next();
            listNumbers.add(Integer.valueOf(data.split(",")[1]));
        }

        int maxValue = listNumbers.stream().max(Comparator.comparing(Integer::valueOf)).get();
        int minValue = listNumbers.stream().min(Comparator.comparing(Integer::valueOf)).get();

        System.out.println("Max value is : "+maxValue);
        System.out.println("Min value is : "+minValue);
    }
    catch (FileNotFoundException ex)
    {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}
0 голосов
/ 13 марта 2019

Вы на правильном пути, прочитав строки файла и разделив каждую строку разделителем (запятая в вашем регионе).

Чтобы найти максимальное значение, у вас есть несколько возможностей. Простым будет атрибут класса, скажем, private int maxValue = -1;, который вы можете использовать для хранения текущего максимума в цикле. Убедитесь, что maxValue меньше текущего значения (mark в вашем коде), и если да, установите maxValue = mark;.

В качестве альтернативы вы можете хранить все значения в структуре данных для примитивов и String s или создавать объекты надлежащего пользовательского класса и сохранять их, например, в List. Затем выполните итерацию структуры или используйте обновленный API потока. Вот небольшой пример:

public static void main(String[] args) {
    // use java.nio to access the file system object
    Path csvPath = Paths.get("U:\\temp\\stackoverflow\\some_file.csv");
    // create a data structure that stores the values read from csv file
    Map<String, Integer> lineValues = new HashMap<String, Integer>();
    try {
        // read the file content (this does not take care of a header line!)
        List<String> lines = Files.readAllLines(csvPath, StandardCharsets.ISO_8859_1);
        // split each line into the values  
        lines.forEach(line -> {
            String[] values = line.split(",");
            // put the values into the data structure
            lineValues.put(values[0], Integer.parseInt(values[1]));
        });

        // use the stream api to get the maximum value from the data structure
        int max = lineValues.values().stream().max(Integer::compareTo).get();
        // print the result
        System.out.println("The maximum value in " + csvPath.toAbsolutePath().toString() + " is " + max);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...