Voici mon fichier CSV: marks.csv et il contient avec le numéro d'étudiant à gauche et les marques à droite: J'ai besoin de pouvoir rechercher dans ce fichier et trouver la marque maximale et la marque minimale. J'ai ce code qui renvoie les valeurs mais je ne sais pas quoi faire après: p> et cela renvoie ce qui suit: p> Que puis-je essayer ensuite? p> p>
4 Réponses :
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); } } You can store values in Treeset and then fetch first and last element. Treeset stores element in sorted order.
Vous êtes sur la bonne voie en lisant les lignes du fichier et fractionnez chaque ligne par le séparateur (virgule dans votre locale).
Pour trouver la valeur maximale, vous avez plusieurs possibilités. Un simple serait un attribut de classe, disons Vous pouvez également stocker toutes les valeurs d'une structure de données pour les primitives et privé int maxvalue = -1; code> que vous pouvez utiliser pour stocker le maximum actuel de votre boucle. Vérifiez si
maxvalue code> est inférieur à la valeur actuelle (
marque code> dans votre code) et si oui, définissez
maxvalue = marquage; p>. P>.
String code> s ou faire des objets d'une classe personnalisée appropriée et stocker ceux dans une liste
code>, par exemple . Ensuite, itérale la structure après ou utilisez l'API de flux à jour. Un petit exemple est-ce: p>
Une réponse plus courte, plus claire et moins verbeuse à cela pourrait être la suivante:
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(); } }
Sympa, je n'avais jamais entendu parler de cette classe avant
C'est la joie de l'API de flux pour vous. Amples choses à travailler avec la plupart d'entre eux sous le radar.
Vous pouvez faire quelque chose comme ça, gardez à l'esprit que j'ai utilisé des flux d'entiers dans Java 8 pour trouver le min et max de la liste:
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); } }
Stockez les valeurs les plus basses et les plus élevées dans un VaR et comparez chaque valeur au fur et à mesure de son lecture, remplacez la valeur stockée selon le cas.