string.length在java中无法正常工作

时间:2014-01-24 11:01:57

标签: java string string-length

您好我有一个代码可以检查字符串是否是回文。代码是这样的:

         package ProjeTarahi;

         import java.util.*;
         import java.io.File;
         import java.io.FileInputStream;
         import java.io.FileNotFoundException;
         import java.util.Scanner;
         import java.util.logging.Level;
         import java.util.logging.Logger;
         import java.lang.String;

         public class Main 
         {

         public boolean CheckIsSymmetric(String s)
            {
               if (s.length()<=1) 
               {
                   return true;

                }

        if (s.charAt(0)==s.charAt(s.length()-1))
        {
            String sub = s.substring(1,s.length()-2);
            return CheckIsSymmetric(sub);
        }
        else
        {
            return false;
        }


    }

    public static void main(String args[])throws FileNotFoundException
    {
        Scanner sc=new Scanner(new FileInputStream(new File("in.txt")));
        String input=sc.nextLine();
        Main p=new Main();

        if(p.CheckIsSymmetric(input)==true)
        {
            System.out.println("in reshte motegharen ast");
        }
        else 
        {
            System.out.println("infinite");
        }

    }
}

我在c#中编写了一个与上面的代码完全相同的代码,它的工作非常好但是它在java中不能正常工作,并且它的输出总是无限的。我跨过了我的代码,我认为问题出现在CheckSymmetric()的第一个if语句中,它总是跳过它,但我不知道为什么。有人可以帮助我PLZ吗?

7 个答案:

答案 0 :(得分:16)

这是.NET中的String.Substring(int)和Java中的String.substring(int, int)之间的区别。

在.NET中,第二个参数是您尝试采用的子字符串的 length

在Java中,第二个参数是您尝试采用的子字符串的独占结束索引

例如:

// .NET
"Hello world".Substring(3, 4) => "lo w"

// Java
"Hello world".substring(3, 4) => "w"

你试图在字符串结尾前取一个以1个字符结尾的子字符串,所以你想要

String sub = s.substring(1, s.length() - 1);

从中吸取教训:

  • 在假设平台的这个基本部分是错误的之前,假设您的代码是错误的。你发现像String.length()一样简单和基本的东西的机会几乎为零。
  • 使用调试和诊断来解决问题所在:您应该能够看到Java代码在字符串末尾修剪过多。
  • 不要假设在不同平台上具有相同签名的两种方法将以完全相同的方式工作。阅读文档!

答案 1 :(得分:6)

String中的

length方法返回字符串的长度。在这里,您希望在删除第一个char和最后一个char后获取子字符串。因此

    String sub = s.substring(1,s.length()-2);

应该是:

    String sub = s.substring(1,s.length()-1);

答案 2 :(得分:2)

阅读Java documentation on substring,我注意到这一行:

  

子字符串从指定的beginIndex开始,并扩展到索引endIndex - 1

处的字符

因此,要获得所需的结果,您需要将其更改为

 String sub = s.substring(1, s.length() - 1);

答案 3 :(得分:0)

String.substring的Java文档:
 * @param beginIndex起始索引,包括在内。
 * @param endIndex结束索引,独占。

这意味着: String s =“AbccbA”; 的System.out.println(s.substring(1,s.length() - 2));

返回:“bcc” 但不像你期望的那样“bccb”。

答案 4 :(得分:0)

public boolean checkIsSymmetric(String s) {
  return new StringBuilder(s).reverse().toString().equals(s);
}

保持简单并使用API​​。

答案 5 :(得分:0)

您的代码唯一的问题是您必须更改:

String sub = s.substring(1,s.length()-2); to
String sub = s.substring(1,s.length()-1);

您的代码不会为您提供所需的结果,并且当您的输入长度为2时,您将获得 IndexOutOfBoundsException

我猜你的问题可能是你正在从文件中读取字符串,并且在文件的末尾,编辑器可能会添加一些额外的字符而不会被人看到。

从文件中读取内容尝试硬编码并检查代码

//String input=sc.nextLine();
String input = "d";

我想这应该可行。

答案 6 :(得分:0)

令人惊讶的是,这类问题在计算机科学相关课程中出现了很多。这是我查找字符串回文的版本。此版本旨在剥离任何非单词字符,并将每个字符缩小为小写。它也适用于数字,因为它只是将它作为一个字符串进行比较。它只有13行,主要和布尔方法。不用于循环,子串或任何东西。

希望我能帮忙! -Cheers

p / s:我为自己的缩进风格道歉:D

import java.util.Scanner;
public class Palindrome  {
   public static void main(String[]args){
      if(isReverse()){System.out.println("This is a palindrome.");}
      else{System.out.print("This is not a palindrome");}
   }
   public static boolean isReverse(){
     Scanner keyboard =  new Scanner(System.in);
      System.out.print("Please type something: "); 
      String line = ((keyboard.nextLine()).toLowerCase()).replaceAll("\\W","");
      return (line.equals(new StringBuffer(line).reverse().toString()));
   }
}

我使用了String的StringBuffer集成类和元字符“/ W”(所有非单词字符,必须是大写字母W)。请随意批评或讨论!