Java ArrayIndexOutOfBoundsException продолжает появляться при попытке найти наиболее часто встречающееся слово в файле - PullRequest
0 голосов
/ 26 августа 2018

В настоящее время я создаю программу, которая читает файл и печатает наиболее часто встречающиеся слова, и сколько раз каждое слово выглядит так:

package WordLookUp;

import java.util.*;
import java.io.*;
import java.lang.*;

public class WordLookUp {

    private String[] mostWords;
    private Scanner reader;
    private String line;
    private FileReader fr;
    private BufferedReader br;
    private List<String> original;
    private String token = " ";


    public WordLookUp(String file) throws Exception {
        this.reader = new Scanner(new File(file));
        this.original = new ArrayList<String>();



        while (this.reader.hasNext()) { //reads file and stores it in string
            this.token = this.reader.next();
            this.original.add(token); //adds it to my arrayList
        }


    }

    public void findMostOccurringWords() {
        List<String> mostOccur = new ArrayList<String>();
        List<Integer> count = new ArrayList<Integer>();
        int counter = 0;


        this.mostWords = this.token.split(" "); //storing read lines in mostWords arrayList

        try {

        for (int i = 0; i < original.size(); i++) {
            if (this.original.equals(this.mostWords[i])) { 
                counter++; //increase counter
                mostOccur.add(this.mostWords[i]);
                count.add(counter);
            }
        }

        for (int i = 0; i < mostOccur.size(); i++) {
            System.out.println("Word: " + mostOccur.get(i) + " count: " + count.get(i));
        }

        } catch (ArrayIndexOutOfBoundsException ae) {
            System.out.println("Illegal index");
        }
    }






}


package WordLookUp;

import java.util.*;
import java.io.*;


public class Main {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub


        WordLookUp wL = new WordLookUp("tiny1.txt");

        wL.findMostOccurringWords();



    }

}

Поэтому, когда я продолжаю запускать свой файл, оно выдает исключениеЯ дал это: «Нелегальный индекс».Я думаю, что это мой findMostOccuringWords метод.Мне логика кажется правильной, но я не знаю, почему она выбрасывает ArrayIndexOutOfBoundsException.Я попытался поиграть с циклами for и попытался перейти с int i = 0 to i < mostOccur.size() - 1, но это тоже не работает.Моя логика неверна?Мне не разрешено использовать hashmap, и наш профессор намекнул, что мы можем легко выполнить это назначение с массивами и ArrayLists (никаких других встроенных функций нет, но регулярные выражения настоятельно рекомендуется использовать также и для остальныхназначение).Я положил туда частные FileReader и BufferedReader, пытаясь понять, будут ли они работать лучше или нет.Спасибо за совет!

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Можете ли вы попробовать использовать следующие коды?Я думаю, что ваш текущий алгоритм неверен.

public class WordLookUp {
private List<String> original;
private List<String> mostOccur = new ArrayList<String>();
private List<Integer> count = new ArrayList<Integer>();


public WordLookUp(String file) throws Exception {
    try(Scanner reader = new Scanner(new File(file));){
        this.original = new ArrayList<String>();
        String token = " ";
        while (reader.hasNext()) { //reads file and stores it in string
            token = reader.next();
            this.original.add(token); //adds it to my arrayList
            findMostOccurringWords(token);
        }
    }
}

public void findMostOccurringWords(String token) {
    int counter = 0;
    String[] mostWords = token.split(" "); //storing read lines in mostWords arrayList
    try {
        for (int i = 0; i < mostWords.length; i++) {
            for(int j = 0; j < this.original.size(); j++) {
                if (original.get(j).equals(mostWords[i])) {
                    counter++; //increase counter
                }
            }
            if (mostOccur.contains(mostWords[i])) {
                count.set(mostOccur.indexOf(mostWords[i]),counter);
            }else {
                mostOccur.add(mostWords[i]);
                count.add(counter);
            }
        }
    } catch (ArrayIndexOutOfBoundsException ae) {
        System.out.println("Illegal index");
    }
}

public void count() {
    for (int i = 0; i < mostOccur.size(); i++) {
        System.out.println("Word: " + mostOccur.get(i) + " count: " + count.get(i));
    }
}
}

public class Main {

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    WordLookUp wL = new WordLookUp("F:\\gc.log");

    wL.count();

}

}

0 голосов
/ 26 августа 2018

Вот в этом цикле:

for (int i = 0; i < mostOccur.size(); i++) {
     System.out.println("Word: " + mostOccur.get(i) + " count: " + count.get(i));
}

Вы проверяете, чтобы убедиться, что i находится в пределах для mostOccur, но не count. Я бы добавил условие, чтобы проверить, чтобы оно было в границах. Такие как:

for (int i = 0; i < mostOccur.size() && i < count.size(); i++) {
     System.out.println("Word: " + mostOccur.get(i) + " count: " + count.get(i));
}
...