为什么包含和添加彼此混淆?

时间:2019-03-07 07:34:26

标签: java add contains

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 :(得分:0)

您得到ArrayIndexOutOfBoundsException的原因是您试图查找列表中不存在的字符串的索引。要解决此问题,您应该在!之前添加list.contains(s.substring(i, j))

添加此代码后,您的代码可以编译并运行,但是会得到一个空数组。发生这种情况是由于行i = j;

为什么?因为最初您是在做int j = i;,所以逻辑上要找到单词长度(如果它是字母),然后进行j++,一旦找到长度,您进行i = j;。因此,基本上ij中发生的事情将始终具有相同的值。因此,当您执行子字符串时,由于ij是相同的,因此会返回注释。 Try commenting this line i = j;,您应该会看到输出。我建议您稍微改变一下逻辑以找到单词并将其添加到列表中