以下代码是到目前为止的整个程序(只是为了避免任何遗漏的部分。
我遇到的问题是我尝试使用.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()方法。
答案 0 :(得分:2)
这似乎源于对++
所做的事情的困惑。 j++
会返回j
的值,之后会增加j
。
.substring(j,j++)
将始终返回空字符串,因为它在获取j inclusive和j exclusive之间的子字符串后递增j
。 substring(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
。