Convertir ArrayList vers TreeMap

Fermé
ng73800 Messages postés 12 Date d'inscription samedi 12 février 2011 Statut Membre Dernière intervention 24 décembre 2021 - 9 juil. 2020 à 11:54
ng73800 Messages postés 12 Date d'inscription samedi 12 février 2011 Statut Membre Dernière intervention 24 décembre 2021 - 12 juil. 2020 à 11:31
Bonjour,

j'ai un petit soucis de compréhension, je vais mettre le code ici et tenter d'expliquer mon problème.

J'ai une première classe, ReadSymptomFromDataFile :


package com.hemebiotech.analytics;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Simple brute force implementation
 *
 */
public class ReadSymptomDataFromFile implements ISymptomReader {

	private final String filepath;

	/**
	 *
	 * @param filepath a full or partial path to file with symptom strings in it, one per line
	 */
	public ReadSymptomDataFromFile (String filepath) {
		this.filepath = filepath;
	}

	@Override
	public List<String> getSymptoms (){
		ArrayList<String> result = new ArrayList<>();

		if (filepath != null) {
			try {
				BufferedReader reader = new BufferedReader (new FileReader(filepath));
				String line = reader.readLine();

				while (line != null) {
					result.add(line);
					line = reader.readLine();
				}
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return result;
	}

}




Cette classe sert à lire un fichier txt qui contient une liste de symptômes, avec plusieurs fois le même symptômes à l'intérieur, d'ou l'intéret de la TreeMap, un symptôme associé au nombre de fois ou il apparaît. (Value, Key)
Jusque là tout va bien.

Ensuite, j'ai ce code que j'ai fait moi mais qui se passe de la classe ReadSymptomData :


package com.hemebiotech.analytics.Test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;

public class MainAppTest2 {

    public static void main (String[] args) {

        try {
            File file = new File ("Project02Eclipse\\symptoms.txt");
            Scanner scan = new Scanner (file);

            Map<String, Integer> wordCount = new TreeMap<> ();
            while (scan.hasNext ()) {
                String word = scan.next ();
                if (!wordCount.containsKey (word)) {
                    wordCount.put (word, 1);
                } else {
                    wordCount.put (word, wordCount.get (word) + 1);
                }
            }

            // Result in console & Write file output
            FileWriter writer = new FileWriter ("resultat2.out");
            BufferedWriter out = new BufferedWriter (writer);
            for (Map.Entry<String, Integer> entry : wordCount.entrySet ()) {
                System.out.println ("Valeur: " + entry.getKey () + "| Occurence: " + entry.getValue ());
                out.write (entry.getKey () + " = " + entry.getValue () + " \n");
                out.flush (); // Force write
            }

        } catch (IOException e) {
            System.out.println ("Fichier introuvable");
        }

    }
}



Ce code fait la même chose à peu près, elle lis un fichier txt, l'enregistre dans une TreeMap, l'affiche sur la console et l'enregistre dans un fichier resultat.out

Maintenant mon problème, c'est que j'essaye de découper mon code en plusieurs classes tout en utilisant la classe déjà existante ReadSymptomData, une classe pour lire le fichier texte, une autre pour convertir tout ça en TreeMap, une autre classe pour écrire les résultats dans un fichier de sortie, et une dernière pour la gestion des exceptions.

J'ai commencé avec cette classe FileToTreeMap, mais c'est moche, c'est pas propre, et je suis sûr qu'il est possible de faire mieux pour convertir mon objet ReadSymptomDataFromFile vers une TreeMap :


package com.hemebiotech.analytics.Test.read;

import com.hemebiotech.analytics.ReadSymptomDataFromFile;

import java.util.*;

public class FileToTreeMap {

    // Read file
    public Map<String, Integer> readFile (){

        ReadSymptomDataFromFile list = new ReadSymptomDataFromFile ("Project02Eclipse\\symptoms.txt");
        Map<String, Integer> listSort = new TreeMap<> ();
        ArrayList<String> test = new ArrayList<> (list.getSymptoms ());

        Scanner scan = new Scanner (String.valueOf (test));
        while (scan.hasNext ()) {
            String word = scan.next ();
            if (!listSort.containsKey (word)) {
                listSort.put (word, 1);
            } else {
                listSort.put (word, listSort.get (word) + 1);
            }
        }

        for (Map.Entry<String, Integer> entry : listSort.entrySet ()) {
            System.out.println ("Valeur: " + entry.getKey () + " Occurence: " + entry.getValue ());
        }


        return listSort;
    }

}



Voilà, je suis un peu perdu dans la découpe de mon code, et le principal problème que j'ai, c'est de convertir mon ArrayList vers une TreeMap.

Désolé pour la longueur du poste, mais j'apprécierait toute l'aide que l'on m'apporte, merci d'avance.

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 9 juil. 2020 à 20:43
Bonjour,

"Désolé pour la longueur du poste"
Aucun problème, s'il pouvait être tous aussi détaillé le forum serait bien plus agréable à lire :-)

"Voilà, je suis un peu perdu dans la découpe de mon code"
Tout d'abord il semble que la notion d'objet ne soit pas bien comprise, que ce soit "FileToTreeMap" ou "ReadSymptomDataFromFile", on est plutôt sur un nommage de méthodes, pas de classe.
S'il devait y avoir un objet ici, ce serait Symptom. Certes le fait qu'il soit assimilable à un String pourrait rendre la classe superflue, mais il n'empêche que pour ta conception de code et la manière de la découper c'est autour de la notion de Symptom que les classes devraient graviter, pas autour des File ou des Map qui les manipulent.

Pour reprendre la structure de l'interface ISymptomReader, je te suggère de créer la classe SymptomReader et d'y placer toutes les méthodes de lecture de Symptom, que ce soit celles te donnant une List ou celles te donnant une Map.

Par exemple :

package com.hemebiotech.analytics;

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class SymptomReader implements ISymptomReader {

    private final Path path;

    public SymptomReader(String filePath) {
        path = Paths.get(filePath);
    }

    @Override
    public List<String> getSymptoms(){
        try {
            return Files.readAllLines(path);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    public Map<String, Long> getSymptomsCount(){
        try {
            return Files.lines(path).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    public static void main(String[] args) {
        SymptomReader reader = new SymptomReader("D:/symptoms.txt");
        System.out.println(reader.getSymptoms());
        System.out.println(reader.getSymptomsCount());
    }
}
0
ng73800 Messages postés 12 Date d'inscription samedi 12 février 2011 Statut Membre Dernière intervention 24 décembre 2021
12 juil. 2020 à 11:31
Merci pour ta réponse !

En effet le code est plus clair comme ça.
L'ancienne classe ReadSymptom est écrite en ancien Java.

Je vais étudier tout ça, merci encore.
0