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, и его вывод всегда бесконечен. Я перешагнул через мой код, и я думаю, что проблема в первом операторе if CheckSymmetric(), и он всегда перепрыгивает, но я не знаю почему. Кто-нибудь может мне помочь, плз?
7 ответов
public boolean checkIsSymmetric(String s) {
return new StringBuilder(s).reverse().toString().equals(s);
}
Сохраняйте это простым и используйте API.
Это разница между String.Substring(int)
в.NET, и 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()
практически нулевые. - Используйте отладку и диагностику, чтобы понять, в чем проблема: вы должны были увидеть, что Java-код слишком сильно обрезал конец строки.
- Не думайте, что два метода с одинаковой сигнатурой на разных платформах будут работать одинаково. Прочитайте документацию!
Метод length в String возвращает длину строки. Здесь вы хотите получить подстроку после удаления первого и последнего символа. таким образом
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 sub = s.substring(1,s.length()-2); to
String sub = s.substring(1,s.length()-1);
Ваш код не даст вам желаемого результата, а также вы получите исключение IndexOutOfBoundsException, когда ваш вход имеет длину 2.
Я предполагаю, что ваша проблема может заключаться в том, что вы читаете строку из файла, и в конце файла редактор может добавлять какой-то дополнительный символ, который не виден глазу.
Начните чтение с файла, попробуйте жестко закодировать и проверить свой код
//String input=sc.nextLine();
String input = "d";
Я думаю, это должно сработать.
Документ Java для String.substring:
* @param beginIndex начальный индекс включительно.
* @param endIndex конечный индекс, исключающий.
Это означает, что: String s = "AbccbA"; System.out.println(s.substring(1,s.length()-2));
возвращает: "BCC", но не "BCCB", как вы ожидали.
Удивительно, но этот тип вопросов часто появляется в классах, связанных с информатикой. Вот моя версия нахождения палиндрома Струны. Эта версия предназначена для удаления любых несловарных символов и сокращения каждого символа в нижний регистр. Он также работает с числами, поскольку сравнивает его как строку. Это всего 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()));
}
}
Я использовал интегрированный класс Java StringBuffer и метасимвол "/W" (все несловарные символы должны быть заглавными W). Пожалуйста, не стесняйтесь критиковать или обсуждать!