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

嗨,我有一个代码,检查字符串是否是回文。代码是这样的:

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?

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

保持简单并使用API​​。

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

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

在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()这样简单和基本的东西的bug的几率几乎为零。
  • 使用调试和诊断来解决问题所在:您应该能够看到Java代码在字符串末尾修剪过多。
  • 不要假设在不同平台上具有相同签名的两种方法将以完全相同的方式工作。 阅读文档!

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

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

应该:

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

阅读子字符串上的Java文档 ,我注意到这一行:

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

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

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

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

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

返回:“bcc”但不是你所期望的“bccb”。

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

 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"; 

我想这应该有效。

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

希望我帮忙! -干杯

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)。 请随意批评或讨论!