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

时间:2015-02-21 00:04:15

标签: java arrays string arraylist substring

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

我遇到的问题是我尝试使用.substring(int,int)方法从给定字符串中提取两个字符,并将两个字符写入一个单独的数组中。问题是使用.substring()从字符串中提取的每个字符都是一个空格。根本没有拉信。我使用简单的打印方法测试了该函数,并且它显示打印sentences.get(i).substring(j,j++)仅打印空白空间。它用这些空格填充我的数组。

有什么可能导致这个的任何线索?我的编译器没有给我任何错误或警告。

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()方法。

2 个答案:

答案 0 :(得分:2)

这似乎源于对++所做的事情的困惑。 j++会返回j的值,之后会增加j

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

您还需要使用j + 1 < sentences.get(i).length(),而不是j++,因为您正在尝试检查j时更改j++的值,这是几乎肯定不是你想要的。应该提到的唯一位置{{1}}将位于for循环中的update语句中。

答案 1 :(得分:0)

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

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