Почему хэш-карта не печатается после загрузки в нее значений ArrayList?

#java #file #arraylist #printing #hashmap

#java #файл #arraylist #печать #hashmap

Вопрос:

Я пытаюсь написать программу для школы, которая подсчитывает частоту токенов (в данном случае слов) в данном файле. Программа-драйвер должна использовать структуру списка, чтобы получать каждое слово в том же формате из файла. Затем создается объект FreqCount, который в конечном итоге будет использовать хэш-карту для подсчета частоты токенов. Я заставил драйвер прочитать файл и перенести его в ArrayList, но теперь проблема в том, что либо (а) код для ввода списка не работает, поэтому он пустой (б) функция печати не работает должным образом (маловероятно, поскольку я вырвал ее прямо из w3schools для тестирования). Я некоторое время думал об этом и не могу понять, почему это не сработает.

Драйвер:

 package threetenProg3;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;
import threetenProg3.FreqCount;

public class Driver {
    
    public static void main(String[] args) throws FileNotFoundException{
        File in = new File("test.txt");
        Scanner scanFile = new Scanner(in);
        
        ArrayList<String> parsed = new ArrayList<String>();
        FreqCount fc = new FreqCount(parsed);
        
        while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop
            parsed.add(scanFile.next().toLowerCase());
        }

        System.out.println("ArrayList: n");
        
        for(int i = parsed.size()-1; i>=0; i--) { //prints arraylist backwards
            System.out.println(parsed.get(i));
        }
        
        System.out.println("n Hashmap: n");
        fc.printMap();

        scanFile.close();
    }
}
  

FreqCount:

 package threetenProg3;

import java.util.HashMap;
import java.util.ArrayList;

public class FreqCount {
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    
    FreqCount(ArrayList<String> plist){
        for(int i = plist.size()-1; i>=0; i--) { //puts list into hashmap
            map.put(plist.get(i), 1);
        }
    }
    
    //methods
    
    public void printMap() {
        for (String i : map.keySet()) {
              System.out.println("key: "   i   " value: "   map.get(i));
        }
    }
    
}
  

Единственное, что я мог придумать, это изменить список на ArrayList, но это не имело никакого эффекта.

Редактировать: я понял, что забыл здесь кучу важных вещей.

Текстовый файл:

 ONE TWO ThReE FoUR fIve
six     seven        
EIGHT
     NINE       
TEN ELEVEN
  

какие результаты:

 eleven
ten
nine
eight
seven
six
five
four
three
two
one
  

При печати arraylist он работает отлично. Проблема заключается в том, когда дело доходит до печати хэш-карты. В настоящее время выходные данные для печати хэш-карты пусты (так как после «Hashmap: » ничего не отображается.

Спасибо всем, кто может помочь, быстрая обратная связь очень ценится 🙂

Комментарии:

1. @Sweeper Большое спасибо, сейчас должно быть обновлено.

Ответ №1:

Эта строка:

 FreqCount fc = new FreqCount(parsed);
  

волшебным образом не «привязывает» список массивов parsed к карте. Он просто добавляет то, что в данный момент находится parsed внутри fc.map . Если вы изучите свой код, вы увидите, что parsed он пуст во время выполнения приведенной выше строки. Таким образом, вы ничего не добавляете к карте.

Вы должны переместить эту строку после добавления в список массивов. Например, непосредственно перед печатью "Hashmap:" :

 FreqCount fc = new FreqCount(parsed);
System.out.println("n Hashmap: n");
fc.printMap();
  

Комментарии:

1. Отлично, я знал, что делаю что-то глупое, но я не мог этого увидеть, потратив на это столько времени. Спасибо!!

2. Щелкнул по первому импульсу, вот и все 🙂

Ответ №2:

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

 package threetenProg3;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;
import threetenProg3.FreqCount;

public class Driver {
    
    public static void main(String[] args) throws FileNotFoundException{
        File in = new File("test.txt");
        Scanner scanFile = new Scanner(in);
        
        ArrayList<String> parsed = new ArrayList<String>();
        
        while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop
            parsed.add(scanFile.next().toLowerCase());
        }

        System.out.println("ArrayList: n");
        
        for(int i = parsed.size()-1; i>=0; i--) { //prints arraylist backwards
            System.out.println(parsed.get(i));
        }
        
        System.out.println("n Hashmap: n");
        FreqCount fc = new FreqCount(parsed); // Moved fc here
        fc.printMap();

        scanFile.close();
    }
}
  

Комментарии:

1. Большое спасибо, это было очень полезно!