您好我有一个代码可以检查字符串是否是回文。代码是这样的:
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吗?
答案 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()
一样简单和基本的东西的机会几乎为零。答案 1 :(得分:6)
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:我为自己的缩进风格道歉:Dimport 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)。请随意批评或讨论!