Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 增加键频率的HashMap值不会';t打印_Java_Arraylist_Hashmap_Frequency - Fatal编程技术网

Java 增加键频率的HashMap值不会';t打印

Java 增加键频率的HashMap值不会';t打印,java,arraylist,hashmap,frequency,Java,Arraylist,Hashmap,Frequency,我目前正在做一个项目,计算文本文件中单词的频率。驱动程序将单词放入ArrayList(在将其设置为小写并删除空格后),然后FreqCount对象将ArrayList放入HashMap,该HashMap将处理频率操作。到目前为止,我可以让驱动程序读取文本文件,将其放入ArrayList,然后将其放入HashMap。我的问题是HashMap节点不会重复,因此每次看到单词时,我都会尝试增加值 司机: package threetenProg3; import java.io.File; import

我目前正在做一个项目,计算文本文件中单词的频率。驱动程序将单词放入ArrayList(在将其设置为小写并删除空格后),然后FreqCount对象将ArrayList放入HashMap,该HashMap将处理频率操作。到目前为止,我可以让驱动程序读取文本文件,将其放入ArrayList,然后将其放入HashMap。我的问题是HashMap节点不会重复,因此每次看到单词时,我都会尝试增加值

司机:

package threetenProg3;

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


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());
        }
        
        for(int i = parsed.size()-1; i>=0; i--) { //prints arraylist backwards
            System.out.println(parsed.get(i));
        } //*/
        
        FreqCount fc = new FreqCount(parsed);
        
        System.out.println("\n Hashmap: \n");
        fc.printMap();
        
        scanFile.close();
        
    }
}
输出:

one,
one,
one,
one
one
one
one
one
one
one
one
one
one
one
one
one
one
eleven
ten
nine
eight
seven
six
five
four
three
two
one

 Hashmap: 

key: nine value: 1
key: one, value: 1
key: six value: 1
key: four value: 1
key: one value: 1
key: seven value: 1
key: eleven value: 1
key: ten value: 1
key: five value: 1
key: three value: 1
key: two value: 1
key: eight value: 1

据我所见,输出应该是打印按键频率的正确值。提前感谢您的帮助

您可以更改
FreqCount
的定义,如下所示:

FreqCount(List<String> driverList) {
    for (int dLIndex = driverList.size() - 1; dLIndex >= 0; dLIndex--) {
        String key = driverList.get(dLIndex);
        if (map.get(key) == null) {
            map.put(key, 1);
        } else {
            map.put(key, map.get(key) + 1);
        }
    }
}
或者,

FreqCount(List<String> driverList) {
    for (int dLIndex = driverList.size() - 1; dLIndex >= 0; dLIndex--) {
        String key = driverList.get(dLIndex);
        map.put(key, map.getOrDefault(key, 0) + 1);
    }
}
FreqCount(列表驱动器列表){
对于(int-dLIndex=driverList.size()-1;dLIndex>=0;dLIndex--){
String key=driverList.get(dLIndex);
map.put(key,map.getOrDefault(key,0)+1);
}
}

返回指定键映射到的值,如果此映射不包含该键的映射,则返回默认值。

您有几个问题

FreqCount(List<String> driverList){
    for(int dLIndex = driverList.size()-1; dLIndex>=0; dLIndex--) { //puts list into hashmap
        if(map.get(driverList.get(dLIndex)) != null) {
            int tval = map.get(driverList.get(dLIndex));
            map.remove(driverList.get(dLIndex));
            map.put(driverList.get(dLIndex), tval+1);
        }else {
            map.put(driverList.get(dLIndex), 1);
        }
    }

}
现在的输出是

one
one
one
one
one
one
one
one
one
one
one
one
one
one
one
one
one
eleven
ten
nine
eight
seven
six
five
four
three
two
one

 Hashmap: 

key: nine value: 1
key: six value: 1
key: four value: 1
key: one value: 18
key: seven value: 1
key: eleven value: 1
key: ten value: 1
key: five value: 1
key: three value: 1
key: two value: 1
key: eight value: 1

即使使用comas,单词也不会重复,而且每个单词的计数都是正确的,imo,最简单的方法就是使用这个方法。该方法采用上一个值并应用映射函数。在这种情况下,第二个值未使用。第一个值用于替换现有值+1。因此,您将获得字符串出现的频率

还请注意,我将类更改为使用
parse
方法返回映射。在类构造函数中进行大量计算是不合适的

在读入值之后

         
FreqCount fc = new FreqCount();
Map<String,Integer> map = fc.parse(parsed);
        
map.entrySet().forEach(System.out::println);
修改类


class FreqCount {
    // attributes and initializations
    private Map<String, Integer> map =
            new HashMap<>();
    
    public Map<String, Integer> parse (List<String> driverList) {
        for (String str : driverList) {
            map.merge(str, 1, (v1,notUsed)->v1 + 1);
        }
        return map;
    }
}

类频率计数{
//属性和初始化
私人地图=
新的HashMap();
公共地图解析(列表驱动列表){
for(字符串str:driverList){
合并(str,1,(v1,未使用)->v1+1);
}
返回图;
}
}

这看起来正是我需要的,但在eclipse中重新键入代码后,它仍然将所有值打印为1。即使从这里直接复制和粘贴到代码中,也会产生相同的结果。要清楚的是,所有这些修复都发生了,不仅仅是你的。别担心!我认为这是一个eclipse问题,并将所有内容转移到一个新的项目中。现在可以了。非常感谢!!不幸的是,我不能使用这些高级映射函数(对不起,我应该提到这一点),这是作业的一部分。我得到了我的答案,但非常感谢!谢谢我认为我们还没有涉及正则表达式,所以我将更深入地研究它,看看这是否是我的教授想要的。
while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop
        String value = scanFile.next().toLowerCase();
        value = value.replaceAll("[,.]", "");
        parsed.add(value);
    }
one
one
one
one
one
one
one
one
one
one
one
one
one
one
one
one
one
eleven
ten
nine
eight
seven
six
five
four
three
two
one

 Hashmap: 

key: nine value: 1
key: six value: 1
key: four value: 1
key: one value: 18
key: seven value: 1
key: eleven value: 1
key: ten value: 1
key: five value: 1
key: three value: 1
key: two value: 1
key: eight value: 1
         
FreqCount fc = new FreqCount();
Map<String,Integer> map = fc.parse(parsed);
        
map.entrySet().forEach(System.out::println);
nine=1
one,=3
six=1
four=1
one=15
seven=1
eleven=1
ten=1
five=1
three=1
two=1
eight=1

class FreqCount {
    // attributes and initializations
    private Map<String, Integer> map =
            new HashMap<>();
    
    public Map<String, Integer> parse (List<String> driverList) {
        for (String str : driverList) {
            map.merge(str, 1, (v1,notUsed)->v1 + 1);
        }
        return map;
    }
}