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

Posted

技术标签:

【中文标题】为啥在将 ArrayList 值加载到其中后 HashMap 不打印?【英文标题】:Why doesn't the HashMap print after loading ArrayList values into it?为什么在将 ArrayList 值加载到其中后 HashMap 不打印? 【发布时间】:2021-02-25 03:25:09 【问题描述】:

我正在尝试为学校编写一个程序来计算给定文件中标记(在本例中为单词)的频率。驱动程序应该使用列表结构从文件中获取相同格式的每个单词。然后,创建一个 FreqCount 对象,并最终使用 hashmap 来计算令牌频率。我让驱动程序读取文件并将其放入 ArrayList,但现在的问题是(a)输入列表的代码不起作用,所以它是空的(b)打印功能无法正常工作(不太可能因为我直接从 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();
    

频率计数:

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

打印数组列表时,它可以完美运行。问题在于打印哈希图时。目前,打印哈希图的输出是空白的(因为在“哈希图:”之后什么都没有显示。

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

【问题讨论】:

@Sweeper 非常感谢,现在应该更新了。 【参考方案1】:

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

【讨论】:

非常感谢,这对您很有帮助!【参考方案2】:

这一行:

FreqCount fc = new FreqCount(parsed);

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

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

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

【讨论】:

完美,我知道我在做一些愚蠢的事情,但在花了这么多时间之后我看不到它。谢谢!! 一时冲动点击了第一个,你去吧:)

以上是关于为啥在将 ArrayList 值加载到其中后 HashMap 不打印?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在将我的 Electron 项目更新到最新版本后会看到“电子安全警告”?

为啥在将我的 Flutter 应用程序迁移到 Android 嵌入 v2 后没有提供 $applicationName 的值?

当我尝试快速加载我的表格视图时,为啥会出现 EXC_BAD_INSTRUCTION 错误?

UIPickerView 在将内容加载到选取器后更改内容文本大小

Prolog - 在将每个值加倍后,从原始列表中创建元素的新列表?

为啥 C# 中的集合类(如 ArrayList)继承自多个接口,如果其中一个接口继承自其余接口?