基本上我想知道aString
是否包含String
。我的问题是比较说aS
aString
的子字符串 "aS".contains("String")
显示为真。
String a="st", b="string";
我跑了System.out.println(a.contains(b));
按预期返回false
。我对包含有所了解,我必须遗漏其他内容。
所以似乎我的程序运行正常,但我做了一些调整并回来了,整个事情都停止了。我怀疑通常是常见的罪魁祸首(brackets, file io, etc.)
。我发现if(string.contains(string))
会继续运行,即:始终为真。不确定为什么会这样,可能是我在代码中遗漏的东西。
这是我的输出示例(通过char读取文件只是一个char):
I
n
t
e
g
e
r
G
;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
public class comp{
public static void main(String[] args){
ArrayList<String> lines = new ArrayList<String>();
ArrayList<String> symbolTable = new ArrayList<String>();
ArrayList<String> parsedFile = new ArrayList<String>();
try {
File file = new File("symbolTable.txt");
Scanner scanner=new Scanner(file);
while (scanner.hasNextLine()&&symbolTable.add(scanner.nextLine().replaceAll("\\s+","").toLowerCase()));
scanner.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
File file = new File("APU_CS400_input.txt");
Scanner scanner=new Scanner(file);
while (scanner.hasNextLine()&&lines.add(scanner.nextLine().replaceAll("\\s+","").toLowerCase()));
scanner.close();
} catch (Exception ex) {
ex.printStackTrace();
}
//runs through line by line of the input file
for(String line: lines){
String sBuild = "";
StringBuilder identifier = new StringBuilder("");
//moves through the line char by char
for(int i=0;line.length()>i; i++){
sBuild+=line.charAt(i);
//moves through the symbol table comparing each symbol to each string
//that is built char by char
for(String symbol: symbolTable){
//if the char string matches the symbol then any identifiers are saved and
//symbols are saved, the string is then reset to empty
//This is where i seem to get an issue
***if(sBuild.contains(symbol)){***
if(symbol.length()<sBuild.length()){
identifier.append(sBuild,0,sBuild.length()-symbol.length());
parsedFile.add(identifier.toString());
identifier.delete(0,sBuild.length()-symbol.length());
}
sBuild="";
parsedFile.add(symbol);
}
}
}
}
for(String symbol:parsedFile){
System.out.println(symbol);
}
}
}
Blockquote
答案 0 :(得分:3)
这样想。
s1.contains(s2)
如果可以找到true
的子字符串,则应返回s1
s1.substring(i, j).equals(s2)
是真的。
如果s2
是一个空字符串,那么i = 0, j = 0
就是一个这样的子字符串,因此contains()
会返回true
。
应该如此。
答案 1 :(得分:1)
if(String.Contains(""))
始终应为真。
答案 2 :(得分:0)
您可能需要在数学上稍微看一下这一点,以了解为什么s.contains("")
始终为真。假设你这样想:
如果某些值a.contains(b)
和i
使j
等于a.substring(i,j)
,则
b
为真。
如果你仔细想一下,你会发现当参数是像contains
这样的非空字符串时,这正是"xyz"
的含义。如果某substring
x
等于"xyz"
,则s.contains("xyz")
为真。如果没有这样的子字符串,则s.contains("xyz")
为假。
因此,相同的逻辑适用于空字符串是有道理的,因为它适用于其他任何地方。并且a.substring(0,0)
等于""
(如果a
不为空)总是如此。这就是a.contains("")
应该永远为真的原因。
从“包含”的英文含义可能不是直观明显的,但是当你处理这样的“边缘情况”时,你有时必须用不同的术语来思考。通常,Javadoc会解决问题,以便您可以轻松地找出边缘情况中发生的情况,而不依赖于直觉。不幸的是,在这种情况下,他们没有。
答案 3 :(得分:0)
基本上我想知道&#34; aString&#34;包含&#34;字符串&#34;。
是的,"aString"
作为字符串值确实包含字符串值"String"
你确定吗? 不能,因此我宁愿怀疑代码中的错误。我的问题是比较说&#34; aS&#34; (&#34; aString&#34;)的子字符串&#34; aS&#34; .contains(&#34; String&#34;)显示为真。
为了免除&#34;空字符串符号&#34;考虑一下:
try {
File file = new File("symbolTable.txt");
Scanner scanner=new Scanner(file);
while (scanner.hasNextLine()) {
// toLowerCase will do nothing for characters that are not letters
// Don't spend CPU cycles with regex
String symbolLine=scanner.nextLine().toLowerCase();
// Collect the symbol only if non-empty?? This will save you from empty symbols
if(symbolLine.trim().length()>0) {
symbolTable.add(symbolLine); // or .add(symbolLine.trim()) ???
}
}
scanner.close();
} catch (Exception ex) {
ex.printStackTrace();
}