Почему содержат и добавляют смущающие друг друга? - PullRequest
0 голосов
/ 07 марта 2019
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author user
 */
public class Exercise1 {

    public static void main(String[] args) throws FileNotFoundException {
        int numOfLines = 0;
        int numOfWords = 0;

        Scanner scan1 = new Scanner(new File("C:/Users/user/Downloads/exercise.txt"));
        ArrayList<String> list = new ArrayList<>();
        int[] arr = new int[1000];
        while (scan1.hasNextLine()) {
            String s = scan1.nextLine();
            for (int i = 0; i < s.length(); i++) {
                if (!Character.isAlphabetic(s.charAt(i))) {
                } else {
                    //is an alphabet
                    int j = i; //stop index;
                    //find the complete word
                    while (Character.isAlphabetic(s.charAt(j))) {
                        j++;
                        if (j == s.length()) {
                            break;
                        }
                    }

                    i = j; //set to last index
                    //check if list has the string
                    if (list.contains(s.substring(i, j))) {
                        list.add(s.substring(i, j));
                        System.out.println(list.size());
                        arr[list.indexOf(s.substring(i, j))]++;
                    } else {
                        arr[list.indexOf(s.substring(i, j))]++;
                    }
                    numOfWords++;
                }
            }
        }
        System.out.println(Arrays.toString(list.toArray()));
        System.out.println(numOfWords);
    }
}

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

Когда строка слова найдена, я заставил код работать, проверив, содержится ли строка слова в ArrayList, если это так, индекс конкретной строки будет использоваться как точка для приращения в другой массив (для записи количества слов).

Но когда я запускаю код, выдается исключение ArrayIndexOutOfBoundException, означающее, что полученный индекс равен -1 (это произойдет, если строка не найдена и ArrayList неявно вернет -1), но когда я попытался протестировать При существовании строки в ArrayList результат равен true , что указывает на то, что ArrayList имеет определенную строку, но все равно возвращает -1 при вызове для индекса строки. Пожалуйста, помогите, большое спасибо!

1 Ответ

0 голосов
/ 07 марта 2019

Вы получаете ArrayIndexOutOfBoundsException, потому что вы пытаетесь найти индекс строки, которой нет в списке. Чтобы решить эту проблему, вы должны добавить ! до list.contains(s.substring(i, j))

После добавления ваш код компилируется и запускается, но вы получаете пустой массив. Это происходит из-за строки i = j;.

Почему? Поскольку изначально вы делаете int j = i;, тогда ваша логика находит длину слова, если оно буквенное, делает j++, а затем, когда у вас есть длина, вы делаете i = j; , Так что в основном то, что происходит в i и j, всегда будет иметь одинаковое значение. Поэтому, когда вы делаете подстроку, возвращается noting, потому что i и j одинаковы. Try commenting this line i = j; и вы должны увидеть результат. Советую немного изменить логику, чтобы найти слово и добавить его в список

...