Преобразовать ArrayList в TreeMap - PullRequest
0 голосов
/ 09 июля 2020

У меня небольшая проблема с пониманием, я помещу здесь код и попытаюсь объяснить свою проблему.

У меня есть первый класс 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;
    }

}

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

Затем у меня есть этот код, который я сделал сам, но он происходит из класса 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");
        }

    }
}

Этот код делает то же самое, он читает текстовый файл, сохраняет его в TreeMap, отображает на консоли и сохраняет в файле resultat.

Теперь моя проблема в том, что я пытаюсь разбить свой код на несколько классов, используя уже существующий класс ReadSymptomData, один класс для чтения текстового файла, другой для преобразования всего этого в TreeMap, другой класс для записи результатов в выходной файл и последний класс для обработки исключений.

Я начал с этой FileToTreeMap class, но он уродлив, он не чистый, и я уверен, что можно было бы лучше преобразовать мой объект ReadSymptomDataFromFile в 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;
    }

}

Здесь я немного заблудился в сокращении своего кода, и основная моя проблема - преобразовать мой ArrayList в TreeMap.

Извините за длину сообщения, но я был бы признателен за любую помощь, которую я получаю, спасибо в аванс.

Ответы [ 4 ]

0 голосов
/ 09 июля 2020

Вы можете использовать метод слияния Map:

List<String> symptoms = List.of("a", "b", "c", "b", "c", "a", "b", "b", "c");
Map<String, Integer> counts = new TreeMap<>();
symptoms.forEach(s -> counts.merge(s, 1, Integer::sum));

counts.forEach((k, v) -> System.out.println(k + ": " + v));

Это печатает:

a: 2
b: 4
c: 3
0 голосов
/ 09 июля 2020

Чтобы преобразовать список в карту, вы можете использовать для l oop, который проходит по списку и добавляет каждый элемент один за другим:

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

        for (String word : test) {
            if (!listSort.containsKey(word)) {
                listSort.put(word, 1);
            } else {
                listSort.put(word, listSort.get(word) + 1);
            }
        }
0 голосов
/ 09 июля 2020

Попробовать Java 8

final List<String> symptomList;
final Map<String, Integer> countedSymptoms;
symptoms.forEach((symptom) -> 
    countedSymptoms.put(symptom, Collections.frequency(symptomList, symptom)));
0 голосов
/ 09 июля 2020

Вы просматриваете список и помещаете элементы на карту. Поскольку это arrayList, повторяющиеся элементы останутся. Но заранее не могли понять, зачем нужно читать одни данные в список, а другие - в treeMap? Вы уже загрузили данные о симптомах в treeMap. Так что заглушка кода больше похожа на

for(String el : test) {
 if(!listSort.containsKey(el))
  listSort.put(el,1);
 else
  listSort.put(el, listSort.get(el)+1));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...