String.substring(i,j) 方法获取空格而不是实际字符

String.substring(i,j) method gets blank spaces rather than actual characters

下面的代码是到目前为止的整个程序(只是为了避免遗漏任何部分。

我遇到的问题是我正在尝试使用 .substring(int,int) 方法从给定字符串中提取两个字符并将提取的两个字符写入单独的数组。问题是使用 .substring() 从字符串中提取的每个字符都是空白 space。根本没有拉出任何字母。我使用简单的打印方法测试了该功能,它显示打印 sentences.get(i).substring(j,j++) 仅打印空白 spaces。它用那些空的 spaces.

填充我的数组

关于可能导致此问题的任何线索?我的编译器没有给我任何错误或警告。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class JacSim {

public static void main(String [] args) throws FileNotFoundException {

    Scanner userScanner = new Scanner(System.in);

    System.out.println("Please enter the filename for your input file (with extension).");
    String fileName = userScanner.nextLine();

    File file = new File(fileName);

    Scanner scanner = new Scanner( new FileInputStream(file));

    List<String> sentences = new ArrayList();

    while (scanner.hasNextLine()) {
        String sentence = scanner.nextLine();
        sentences.add(sentence);
    }

    System.out.println("Input Sentences:\n");

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

    List<List<String>> shingles = new ArrayList();

    sentences.stream().forEach((String _item) -> {
        shingles.add(new ArrayList());
    });

    System.out.println("\nSorted Shingle Arrays:\n");

    shinglesMethod(shingles, sentences);
}

private static List shinglesMethod(List<List<String>> shingles, List<String> sentences) {

    for (int i=0;i<sentences.size();i++) {
        for(int j=0;j++<sentences.get(i).length();j++) {
            shingles.get(i).add(sentences.get(i).substring(j,j++));
        }
        showList( i, shingles.get(i) );
    }
    return shingles;
}

private static void showList( int n, List List ) {
    System.out.print(n + " : ");
    List.stream().forEach((o) -> {
        System.out.print( o + " " );
    });
    System.out.println();
}

要注意的代码块是

for (int i=0;i<sentences.size();i++) {
        for(int j=0;j++<sentences.get(i).length();j++) {
            shingles.get(i).add(sentences.get(i).substring(j,j++));
        }
        showList( i, shingles.get(i) );
    }

忘记澄清扫描仪正在正确读取单词并且每个字符串都按预期读取。我发现的唯一问题是 .substring() 方法。

这似乎是因为对 ++ 的作用感到困惑。 j++ returns j 之后 的值递增 j.

.substring(j,j++) 将始终 return 空字符串,因为它在获得 j inclusive 和 j exclusive 之间的子字符串后递增 jsubstring(j, j + 1) 可能更符合您的要求。

您还需要使用 j + 1 < sentences.get(i).length(),而不是 j++,因为您正在尝试检查 j 的值,这几乎可以肯定不是你想要的。唯一应该提及的地方 j++ 是在 for 循环的更新语句中。

j++ 使用 j 的值,然后递增 j 的值。所以你的代码相当于substring(j,j)。此外,当您编写 x.substring(i,j) 时,子字符串从 i 开始并扩展到 j - 1.

处的字符

改用 substring(j,j+2) 并将内部 while 循环的条件更改为 j<sentences.get(i).length() - 2