为什么 HashMap 在将 ArrayList 值加载到其中后不打印?

Why doesn't the HashMap print after loading ArrayList values into it?

我正在尝试为学校编写一个程序来计算给定文件中标记(在本例中为单词)的频率。 driver 程序应该使用列表结构从文件中获取相同格式的每个单词。然后,创建一个 FreqCount object 并最终使用 hashmap 来计算令牌频率。我得到了 driver 来读取文件并将其放入 ArrayList,但现在的问题是 (a) 输入列表的代码不起作用,所以它是空的 (b) 打印函数不是正常工作(不太可能,因为我直接从 w3schools 上撕下来进行测试)。我已经考虑了一段时间,但无法弄清楚为什么它行不通。

Driver:

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();
    }
}

频率计数:

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));
        }
    }
    
}

我唯一能想到的就是将 List 更改为 ArrayList,但没有效果。

编辑:我发现我在这里忘记了一堆重要的东西。

文本文件:

ONE TWO ThReE FoUR fIve
six     seven        
EIGHT
     NINE       
TEN ELEVEN

输出:

eleven
ten
nine
eight
seven
six
five
four
three
two
one

打印数组列表时,效果很好。问题在于打印哈希图时。目前,打印 hashmap 的输出是空白的(因为在“Hashmap:”之后没有任何显示。

感谢任何能提供帮助的人,非常感谢快速反馈:)

您必须在读取列表后创建一个频率计数器,因为您要将值插入到构造函数中的映射中。 由于在您创建 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();
    }
}

这一行:

FreqCount fc = new FreqCount(parsed);

不会神奇地将数组列表 parsed “绑定”到地图。它只是将 parsed 中的当前内容添加到 fc.map 中。如果您检查您的代码,您会发现 parsed 在上述行执行时为空。所以您没有向地图添加任何内容。

添加到数组列表后,您应该将该行移动到。例如,就在您打印 "Hashmap:":

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