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). Пожалуйста, не стесняйтесь критиковать или обсуждать!

Другие вопросы по тегам