Написание этой программы, которая читает текстовый файл с кучей имен. Мне нужно отслеживать экземпляр каждой буквы. Я не знаю, есть ли более простой способ сделать это, чем у меня, без использования чего-либо вроде hashMap. Моя проблема здесь в том, что, делая это длинным путем, я сохраняю частоты в списке строк, а не в более логичном целочисленном списке? Я не уверен, как получить максимальное минимальное значение, если индекс в моем списке содержит строку и присвоенное ей целочисленное значение.
import java.io.*;
import java.util.*;
public class CountInstances {
public static void main(String [] args) throws IOException{
ArrayList<String> list = new ArrayList<String>();//stores textfile into a list
ArrayList<String> frequencies = new ArrayList<String>(); //stores the number of instances for each letter
list = readFile("test.txt");
// System.out.println(list);
frequencies = letterInstances("test.txt");
// System.out.println(frequencies);
outputFile("test.txt", frequencies);
}//end of main
public static ArrayList<String> readFile(String file) throws IOException{
ArrayList<String> list = new ArrayList<String>();
Scanner reader = new Scanner(new File("test.txt"));//scanner accesses file
while(reader.hasNext()){//loops till end of all lines
String line = reader.nextLine();//scanner reads each line
list.add(line);//adds each line to the arrayList
}
return(list);
}//end of readFile method
public static ArrayList<String> letterInstances(String file)throws IOException{
ArrayList<String> instanceList = new ArrayList<String>();
Scanner reader = new Scanner(new File("test.txt"));//scanner accesses file
int frequencyA = 0;
int frequencyB = 0;
int frequencyC = 0;
int frequencyD = 0;
int frequencyE = 0;
int frequencyF = 0;
int frequencyG = 0;
int frequencyH = 0;
int frequencyI = 0;
int frequencyJ = 0;
int frequencyK = 0;
int frequencyL = 0;
int frequencyM = 0;
int frequencyN = 0;
int frequencyO = 0;
int frequencyP = 0;
int frequencyQ = 0;
int frequencyR = 0;
int frequencyS = 0;
int frequencyT = 0;
int frequencyU = 0;
int frequencyV = 0;
int frequencyW = 0;
int frequencyX = 0;
int frequencyY = 0;
int frequencyZ = 0;
while(reader.hasNext()){
String line = reader.nextLine();
for(int i = 0; i< line.length(); i++){
if(line.charAt(i) == 'A' || line.charAt(i) == 'a'){//if letter is found in line, increase counter by 1
frequencyA++;
}else if(line.charAt(i) == 'B' || line.charAt(i) == 'b'){
frequencyB++;
}else if(line.charAt(i) == 'C' || line.charAt(i) == 'c'){
frequencyC++;
}else if(line.charAt(i) == 'D' || line.charAt(i) == 'd'){
frequencyD++;
}else if(line.charAt(i) == 'E' || line.charAt(i) == 'e'){
frequencyE++;
}else if(line.charAt(i) == 'F' || line.charAt(i) == 'f'){
frequencyF++;
}else if(line.charAt(i) == 'G' || line.charAt(i) == 'g'){
frequencyG++;
}else if(line.charAt(i) == 'H' || line.charAt(i) == 'h'){
frequencyH++;
}else if(line.charAt(i) == 'I' || line.charAt(i) == 'i'){
frequencyI++;
}else if(line.charAt(i) == 'J' || line.charAt(i) == 'j'){
frequencyJ++;
}else if(line.charAt(i) == 'K' || line.charAt(i) == 'k'){
frequencyK++;
}else if(line.charAt(i) == 'L' || line.charAt(i) == 'l'){
frequencyL++;
}else if(line.charAt(i) == 'M' || line.charAt(i) == 'm'){
frequencyM++;
}else if(line.charAt(i) == 'N' || line.charAt(i) == 'n'){
frequencyN++;
}else if(line.charAt(i) == 'O' || line.charAt(i) == 'o'){
frequencyO++;
}else if(line.charAt(i) == 'P' || line.charAt(i) == 'p'){
frequencyP++;
}else if(line.charAt(i) == 'Q' || line.charAt(i) == 'q'){
frequencyQ++;
}else if(line.charAt(i) == 'R' || line.charAt(i) == 'r'){
frequencyR++;
}else if(line.charAt(i) == 'S' || line.charAt(i) == 's'){
frequencyS++;
}else if(line.charAt(i) == 'T' || line.charAt(i) == 't'){
frequencyT++;
}else if(line.charAt(i) == 'U' || line.charAt(i) == 'u'){
frequencyU++;
}else if(line.charAt(i) == 'V' || line.charAt(i) == 'v'){
frequencyV++;
}else if(line.charAt(i) == 'W' || line.charAt(i) == 'w'){
frequencyW++;
}else if(line.charAt(i) == 'X' || line.charAt(i) == 'x'){
frequencyX++;
}else if(line.charAt(i) == 'Y' || line.charAt(i) == 'y'){
frequencyY++;
}else if(line.charAt(i) == 'Z' || line.charAt(i) == 'z'){
frequencyZ++;
}
}
}
(Ниже) Сохранение этого раздела в списке массивов строк не позволит мне получить отдельные значения, к которым мне нужно получить доступ, в отдельном методе. Не сохраняя его в списке массивов String, вы бы просто перечислили значения, но я бы не знал, какую букву он представляет.
instanceList.add("A" +frequencyA);
instanceList.add("B = "+ frequencyB);
instanceList.add("C = "+frequencyC);
instanceList.add("D = "+frequencyD);
instanceList.add("E = "+frequencyE);
instanceList.add("F = "+frequencyF);
instanceList.add("G = "+frequencyG);
instanceList.add("H = "+frequencyH);
instanceList.add("I = "+frequencyI);
instanceList.add("J = "+frequencyJ);
instanceList.add("K = "+frequencyK);
instanceList.add("L = "+frequencyL);
instanceList.add("M = "+frequencyM);
instanceList.add("N = "+frequencyN);
instanceList.add("O = "+frequencyO);
instanceList.add("P = "+frequencyP);
instanceList.add("Q = "+frequencyQ);
instanceList.add("R = "+frequencyR);
instanceList.add("S = "+frequencyS);
instanceList.add("T = "+frequencyT);
instanceList.add("U = "+frequencyU);
instanceList.add("V = "+frequencyV);
instanceList.add("W = "+frequencyW);
instanceList.add("X = "+frequencyX);
instanceList.add("Y = "+frequencyY);
instanceList.add("Z = "+frequencyZ);
return(instanceList);
}//end of letter instance method
Не уверен, что здесь делать, чтобы получить максимальную частоту и в порядке убывания.
public static void outputFile(String file, ArrayList<String> list)throws IOException{
PrintWriter writer = new PrintWriter(new File("frequencies.txt"));//prints output to new file
writer.println(letterInstances("test.txt" + "\n"));//prints the frequency of each letter
System.out.println("An output file was created");
int largest = list.indexOf(1);//this index output would get the whole line ex. A = 9 (but I just need to track the number)
for(int i = 0; i < list.size(); i++){
writer.println("Top 5 Letters: ");
writer.close();
}
}
}//конец класса
Решение проблемы
Да. Ты прав. Вы можете использовать хэш-карту. Попробуйте этот код ->
public static Hashmap<String, Integer> letterInstances(String file)throws IOException{
Hashmap<String, String> instanceMap = Hashmap<String, String>;
Scanner reader = new Scanner(new File("test.txt"));//scanner accesses file
while(reader.hasNext()){
String line = reader.nextLine();
for(int i = 0; i< line.length(); i++){
String character = line.get(i).toString().toLowerCase();
int count = 0;
if(instanceMap.containsKey(character)) count = instanceList.get(char);
instanceMap.put(character, count)
}
return instanceMap;
}
Или, если вы также хотите отсортировать их, чтобы получить первые 5 результатов, используйте это ->
public List<Entry<String, Integer>> getTop5(Hashmap map){
Set<Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(
set);
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
System.out.println(list.subList(0, 5)); // this is the list of largest 5 characters in count
return list.subList(0, 5);
}
Комментариев нет:
Отправить комментарий