Метод, который читает данные из файла в HashMap - PullRequest
0 голосов
/ 03 декабря 2018

Мне нужно написать метод, который считывает данные из файла в HashMap, ключом которого является номер строки файла, а значением - текст в строке.И только значения HashMap, ключи которых имеют степень 2, должны быть записаны в другой файл.

Я создал файл со стихотворением сейчас.Написал метод для чтения файла, который печатает текст в ArrayList.Было бы удобно запустить цикл и получить номер строки и текст.Но я не совсем понимаю, что делать дальше.

public static void main(String[] args) throws IOException {

    List<String> fileToRead = FileWriterReader.ourFileReaderToList("HAMLET.txt");
    System.out.println(fileToRead);

    public static List<String> ourFileReaderToList(String fileToRead) throws FileNotFoundException {
        File file = new File(fileToRead);

        List<String> poemLines = new ArrayList<String>();
        Scanner in = null;
        try {
            if (file.exists()) {
                in = new Scanner(file);
                while (in.hasNextLine()) {
                    poemLines.add(in.nextLine());
                }
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }
        return poemLines;
    }

    public static void ourWriterListToFile(String fileToWrite, List<String> listToWrite) throws IOException {
        FileWriter fw = new FileWriter(fileToWrite, true);
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(fw);
            int k = 0;
            for (String s : listToWrite) {
                if (k == (listToWrite.size() - 1)) {
                    bw.write(s);
                } else {
                    bw.write(s + "\n");
                }
                k++;

            }
        } finally {
            bw.close();
            fw.close();
        }
    }

    public static void parsedFile(List<String> listFromFile) {
        for (String s : listFromFile)
            System.out.println(s);

    }
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Большая часть задачи выполнена с помощью существующего метода ourFileReaderToList () , вам просто нужно немного изменить его, чтобы он соответствовал HashMap и суммировать строки файла по мере ихчитаются в. Тип возврата для вашего метода, конечно, должен быть HashMap , и потому что вы хотите, чтобы Key был номером строки файла и значениемдля того, чтобы каждый ключ был фактической строкой строки файла, читаемой в данный момент, ваш тип возвращаемого значения должен быть: HashMap<Integer, String>:

public static HashMap<Integer, String> ourFileReaderToList(String fileToRead) throws FileNotFoundException {

Поскольку вы больше не собираетесь использовать Список Интерфейс в вашем методе, вы можете пойти дальше и изменить его на свой тип возврата:

HashMap<Integer, String> poemLines = new HashMap<>();

Вот как может выглядеть ваш File To HashMap метод:

public static HashMap<Integer, String> fileToHashMap(String fileToRead) throws FileNotFoundException {
    Scanner reader = new Scanner(new File(fileToRead));
    int lineCount = 0;
    HashMap<Integer, String> poemLines = new HashMap<>();
    try {
        while (reader.hasNextLine()) {
            lineCount++;
            String fileLine = reader.nextLine();
            // If you do not want to add blank lines to the
            // collection then uncomment the following lines;
            /*
            if (fileLine.trim().equals("")) {
                continue;
            }
            */
            poemLines.put(lineCount, fileLine); // Add to Collection
        }
    }
    finally {
        reader.close();
    }
    return poemLines;
} 

Теперь, когда у вас есть коллекция в HashMap, вы можете приступить к ее печати на основе полномочий 2. Я полагаю, что это означает, что сначала будет напечатана строка данных 2, затем строка данных 4, затем строка 8, строка16, 32, 64, 128 и т. Д.,и т. д. .... до тех пор, пока значение Powers Of не станет больше, чем доступное количество строк файла, содержащихся в коллекции (это, конечно, если вы имеете в виду степеней 2 ),Вот как это можно сделать:

public static void writeHashmapToFile(String fileToWrite, HashMap<Integer, String> hashmapToWrite) throws IOException {
    // Using 'Try With Resources'.
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(fileToWrite))) {
        int powersOf2 = 2;
        StringBuilder sb;
        for (Object objectName : hashmapToWrite.keySet()) {
            int key = (int) objectName;
            String line = hashmapToWrite.get(key);
            //System.out.println(key + "\t" + line);
            if (key == powersOf2) {
                sb = new StringBuilder();
                sb.append(key).append("\t").append(line).append(System.lineSeparator());
                bw.write(sb.toString());
                powersOf2 *= 2;   // Same as: powersOf2 = powersOf2 * 2
            }
        }
    } 
}
0 голосов
/ 03 декабря 2018

Вы, конечно, можете использовать цикл для преобразования ArrayList в HashMap.Поскольку ArrayList, созданный функцией ourFileReaderToList, сохраняет каждую строку отдельно и по порядку, можно было бы создать другую функцию для чтения значений из списка и подсчета количества строк.

Например:

HashMap listToHashMap(List<String> list) {
    HashMap<Integer, String> poemmap = new HashMap<Integer, String>();    //Our hashmap
    int linenumber = 0;    //Variable to keep track of the line number

    for (String line : list) {
         poemmap.put(linenumber, line);    //Add line and line number to map
         linenumber++;                     //Increment line number
    }

    return poemmap;
}

Эта функция сделает HashMap из списка и вернет его.Строки можно получить с помощью функции HashMap get(), когда их необходимо записать в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...