#java #file #arraylist #printing #hashmap
#java #файл #arraylist #печать #hashmap
Вопрос:
Я пытаюсь написать программу для школы, которая подсчитывает частоту токенов (в данном случае слов) в данном файле. Программа-драйвер должна использовать структуру списка, чтобы получать каждое слово в том же формате из файла. Затем создается объект FreqCount, который в конечном итоге будет использовать хэш-карту для подсчета частоты токенов. Я заставил драйвер прочитать файл и перенести его в ArrayList, но теперь проблема в том, что либо (а) код для ввода списка не работает, поэтому он пустой (б) функция печати не работает должным образом (маловероятно, поскольку я вырвал ее прямо из 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();
}
}
FreqCount:
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));
}
}
}
Единственное, что я мог придумать, это изменить список на ArrayList, но это не имело никакого эффекта.
Редактировать: я понял, что забыл здесь кучу важных вещей.
Текстовый файл:
ONE TWO ThReE FoUR fIve
six seven
EIGHT
NINE
TEN ELEVEN
какие результаты:
eleven
ten
nine
eight
seven
six
five
four
three
two
one
При печати arraylist он работает отлично. Проблема заключается в том, когда дело доходит до печати хэш-карты. В настоящее время выходные данные для печати хэш-карты пусты (так как после «Hashmap: » ничего не отображается.
Спасибо всем, кто может помочь, быстрая обратная связь очень ценится 🙂
Комментарии:
1. @Sweeper Большое спасибо, сейчас должно быть обновлено.
Ответ №1:
Эта строка:
FreqCount fc = new FreqCount(parsed);
волшебным образом не «привязывает» список массивов parsed
к карте. Он просто добавляет то, что в данный момент находится parsed
внутри fc.map
. Если вы изучите свой код, вы увидите, что parsed
он пуст во время выполнения приведенной выше строки. Таким образом, вы ничего не добавляете к карте.
Вы должны переместить эту строку после добавления в список массивов. Например, непосредственно перед печатью "Hashmap:"
:
FreqCount fc = new FreqCount(parsed);
System.out.println("n Hashmap: n");
fc.printMap();
Комментарии:
1. Отлично, я знал, что делаю что-то глупое, но я не мог этого увидеть, потратив на это столько времени. Спасибо!!
2. Щелкнул по первому импульсу, вот и все 🙂
Ответ №2:
вы должны создать счетчик частоты после чтения списка, потому что вы вставляете значения в карту в конструкторе. И поскольку список все еще пуст, когда вы создали 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();
}
}
Комментарии:
1. Большое спасибо, это было очень полезно!