不打印递增键频率的hashmap值

km0tfn4u  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(398)

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

  1. package threetenProg3;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.util.Scanner;
  5. import java.util.ArrayList;
  6. public class Driver {
  7. public static void main(String[] args) throws FileNotFoundException{
  8. File in = new File("test.txt");
  9. Scanner scanFile = new Scanner(in);
  10. ArrayList<String> parsed = new ArrayList<String>();
  11. while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop
  12. parsed.add(scanFile.next().toLowerCase());
  13. }
  14. for(int i = parsed.size()-1; i>=0; i--) { //prints arraylist backwards
  15. System.out.println(parsed.get(i));
  16. } //*/
  17. FreqCount fc = new FreqCount(parsed);
  18. System.out.println("\n Hashmap: \n");
  19. fc.printMap();
  20. scanFile.close();
  21. }
  22. }

频率计数:

  1. package threetenProg3;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. public class FreqCount {
  5. //attributes and initializations
  6. private HashMap<String, Integer> map = new HashMap<String, Integer>();
  7. //constructors
  8. FreqCount(List<String> driverList){
  9. for(int dLIndex = driverList.size()-1; dLIndex>=0; dLIndex--) { //puts list into hashmap
  10. for(String mapKey : map.keySet()) {
  11. if(mapKey.equals(driverList.get(dLIndex))) {
  12. int tval = map.get(mapKey);
  13. map.remove(mapKey);
  14. map.put(mapKey, tval+1);
  15. }else {
  16. map.put(mapKey, 1);
  17. }
  18. }
  19. }
  20. }
  21. //methods
  22. public void printMap() {
  23. for (String i : map.keySet()) { //function ripped straight outta w3schools lol
  24. System.out.println("key: " + i + " value: " + map.get(i));
  25. }
  26. } //*/
  27. }

文本文件:

  1. ONE TWO ThReE FoUR fIve
  2. six seven
  3. EIGHT
  4. NINE
  5. TEN ELEVEN
  6. ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE, ONE, ONE,

输出:

  1. one,
  2. one,
  3. one,
  4. one
  5. one
  6. one
  7. one
  8. one
  9. one
  10. one
  11. one
  12. one
  13. one
  14. one
  15. one
  16. one
  17. one
  18. eleven
  19. ten
  20. nine
  21. eight
  22. seven
  23. six
  24. five
  25. four
  26. three
  27. two
  28. one
  29. Hashmap:
  30. key: nine value: 1
  31. key: one, value: 1
  32. key: six value: 1
  33. key: four value: 1
  34. key: one value: 1
  35. key: seven value: 1
  36. key: eleven value: 1
  37. key: ten value: 1
  38. key: five value: 1
  39. key: three value: 1
  40. key: two value: 1
  41. key: eight value: 1

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

ma8fv8wu

ma8fv8wu1#

你可以改变 FreqCount 具体如下:

  1. FreqCount(List<String> driverList) {
  2. for (int dLIndex = driverList.size() - 1; dLIndex >= 0; dLIndex--) {
  3. String key = driverList.get(dLIndex);
  4. if (map.get(key) == null) {
  5. map.put(key, 1);
  6. } else {
  7. map.put(key, map.get(key) + 1);
  8. }
  9. }
  10. }

更改后的输出:

  1. Hashmap:
  2. key: nine value: 1
  3. key: one, value: 3
  4. key: six value: 1
  5. key: four value: 1
  6. key: one value: 15
  7. key: seven value: 1
  8. key: eleven value: 1
  9. key: ten value: 1
  10. key: five value: 1
  11. key: three value: 1
  12. key: two value: 1
  13. key: eight value: 1

或者,

  1. FreqCount(List<String> driverList) {
  2. for (int dLIndex = driverList.size() - 1; dLIndex >= 0; dLIndex--) {
  3. String key = driverList.get(dLIndex);
  4. map.put(key, map.getOrDefault(key, 0) + 1);
  5. }
  6. }
  7. ``` `Map#getOrDefault` 返回指定键Map到的值,如果此Map不包含该键的Map,则返回默认值。
展开查看全部
sqougxex

sqougxex2#

imo,最简单的方法是使用map.merge方法。该方法接受上一个值并应用Map函数。在这种情况下,第二个值未使用。第一个值用于替换现有值+1。这样就得到了字符串出现的频率。
还请注意,我将我们的类改为使用 parse 返回Map的方法。在类构造函数中进行大量计算是不合适的。
在读入值之后。

  1. FreqCount fc = new FreqCount();
  2. Map<String,Integer> map = fc.parse(parsed);
  3. map.entrySet().forEach(System.out::println);

印刷品

  1. nine=1
  2. one,=3
  3. six=1
  4. four=1
  5. one=15
  6. seven=1
  7. eleven=1
  8. ten=1
  9. five=1
  10. three=1
  11. two=1
  12. eight=1

修改后的类

  1. class FreqCount {
  2. // attributes and initializations
  3. private Map<String, Integer> map =
  4. new HashMap<>();
  5. public Map<String, Integer> parse (List<String> driverList) {
  6. for (String str : driverList) {
  7. map.merge(str, 1, (v1,notUsed)->v1 + 1);
  8. }
  9. return map;
  10. }
  11. }
展开查看全部
nafvub8i

nafvub8i3#

你有几个问题。

  1. FreqCount(List<String> driverList){
  2. for(int dLIndex = driverList.size()-1; dLIndex>=0; dLIndex--) { //puts list into hashmap
  3. if(map.get(driverList.get(dLIndex)) != null) {
  4. int tval = map.get(driverList.get(dLIndex));
  5. map.remove(driverList.get(dLIndex));
  6. map.put(driverList.get(dLIndex), tval+1);
  7. }else {
  8. map.put(driverList.get(dLIndex), 1);
  9. }
  10. }
  11. }

你正在做一些奇怪的for循环,试图遍历一个空Map。您需要检查Map中是否有该单词的键,如果有,则向值中添加一个,如果没有,则添加值为1的新对。
为了避免使用comas或dots的数字(如果需要,可以向regex中添加replaceall作为参数的其他字符)

  1. while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop
  2. String value = scanFile.next().toLowerCase();
  3. value = value.replaceAll("[,.]", "");
  4. parsed.add(value);
  5. }

现在的输出是

  1. one
  2. one
  3. one
  4. one
  5. one
  6. one
  7. one
  8. one
  9. one
  10. one
  11. one
  12. one
  13. one
  14. one
  15. one
  16. one
  17. one
  18. eleven
  19. ten
  20. nine
  21. eight
  22. seven
  23. six
  24. five
  25. four
  26. three
  27. two
  28. one
  29. Hashmap:
  30. key: nine value: 1
  31. key: six value: 1
  32. key: four value: 1
  33. key: one value: 18
  34. key: seven value: 1
  35. key: eleven value: 1
  36. key: ten value: 1
  37. key: five value: 1
  38. key: three value: 1
  39. key: two value: 1
  40. key: eight value: 1

没有重复的话,即使昏迷和正确的计数每一个

展开查看全部

相关问题