为啥在将 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 在将内容加载到选取器后更改内容文本大小