[英]string.length not working properly in 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?
这是.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的几率几乎为零。 String中的length方法返回字符串的长度。 在这里,您希望在删除第一个char和最后一个char后获取子字符串。 从而
String sub = s.substring(1,s.length()-2);
应该:
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”。
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";
我想这应该有效。
令人惊讶的是,这类问题在计算机科学相关课程中出现了很多。 这是我查找字符串回文的版本。 此版本旨在剥离任何非单词字符,并将每个字符缩小为小写。 它也适用于数字,因为它只是将它作为一个字符串进行比较。 它只有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)。 请随意批评或讨论!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.