if(s1.Contains(s2))似乎永远是真的

时间:2016-10-02 00:17:19

标签: java string contains

抱歉,稍微改了一下这个问题。

基本上我想知道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 

4 个答案:

答案 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();
}