string.length在java中工作不正常
嗨,我有一个检查字符串是否为回文的代码。代码如下:string.length在java中工作不正常,java,string,string-length,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; im
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");
}
}
}
package项目;
导入java.util.*;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入java.lang.String;
公共班机
{
公共布尔校验对称(字符串s)
{
字符串中的if(s.length()length方法返回字符串的长度。在这里,您希望在删除第一个字符和最后一个字符后获得子字符串。因此
String sub = s.substring(1,s.length()-2);
应该是:
String sub = s.substring(1,s.length()-1);
在阅读这篇文章时,我注意到这句话:
子字符串从指定的beginIndex开始,并延伸到索引endIndex-1处的字符
因此,要获得所需的结果,您需要将其更改为
String sub = s.substring(1, s.length() - 1);
这是.NET和Java中的区别
在.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()
这样简单而基本的东西中发现错误的几率几乎为零
- 使用调试和诊断来找出问题所在:您应该能够看到Java代码从字符串末尾修剪了太多内容
- 不要假设在不同平台上具有相同签名的两个方法将以完全相同的方式工作。请阅读文档
字符串的Java文档。子字符串:
*@param beginIndex开始索引,包括在内。
*@param endIndex结束索引,独占。
这意味着:
字符串s=“AbccbA”;
System.out.println(s.substring(1,s.length()-2))
返回:“密件抄送”
但不是你想象中的“bccb”
public boolean checkIsSymmetric(String s) {
return new StringBuilder(s).reverse().toString().equals(s);
}
保持简单并使用API。代码的唯一问题是您必须更改:
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";
我想这应该行得通。令人惊讶的是,这种类型的问题在计算机科学相关课程中经常出现。这是我查找字符串回文的版本。这个版本的设计目的是去除所有非单词字符,并将每个字符简化为小写。它还可以处理数字,因为它只会将其作为字符串进行比较。它是o只有13行,包含main和Boolean方法。没有for循环、子字符串或任何内容
希望我能帮忙!
-干杯
我为我的缩进方式道歉: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()));
}
}
我使用了Java的StringBuffer集成类和元字符“/W”(所有非单词字符,必须是大写字母W)。请随意批评或讨论!确保String.length在Java中正常工作。如果输入是一个字符,例如“d”它的输出是无限的,但它应该返回true并输出一些东西else@user1929674如果您按照上面的方式进行更改,那么它将非常有效,因为您已经检查了(s.length()我按照你说的做了,但它输出无限信息,它给你的输入是无限的,它是回文的?@user1929674可能是当你从文件中读取字符串时,最后可能有“\n”新行字符。因此你得到了infinte。嗨,谢谢你的建议,我错误地键入了那行,我在你和很多人告诉我。但我并没有说length()方法不正确并且有bug!我说我的问题在CheckSymmetric()函数的第一个if语句中,即使我的输入只有一个字符,例如它输出的“d”infinite@user1929674:问题的标题是“string.length在java中无法正常工作”.I维护String.length()
在Java中工作得很好,至少在这里可以看到。如果您承认错误存在于您自己的代码中,那么一开始就说其他代码不起作用不是一个好主意……我也尝试了您的代码,但您的代码也总是返回infinite@user1929674我想你的问题出在别的地方了。你把你的全部内容都贴出来了吗对于这段代码?您好,您的代码是正确的。我在Netbeans中尝试过,它还可以。我在eclipse上运行这段代码,它总是输出无限。我把我的代码给了我的一个朋友,在那台机器上,它的输出总是无限的,但当我们切换到Netbeans时,它工作得很好。谢谢。谢谢,我已经意识到问题出在re上正在读取文件,我已经更正了,再次感谢