Передача параметров в задачах Java

#java #string #debugging

#java #строка #отладка

Вопрос:

Я новичок в Java и писал программу для проверки, является ли данная строка периодической или нет.Строка не является периодической, если она не может быть представлена в виде строки меньшего размера, конкатенированной некоторое количество раз. Пример «1010» является периодическим, а «1011» — нет. Вот мой код. Он компилируется, но проблема в том, что он сообщает, что каждая строка не является периодической. Я предполагаю, что проблема связана с циклом for в isPeriodic функции. Пожалуйста, помогите мне исправить это.

 import java.io.*;
import java.util.*;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) throws java.lang.Exception {
        java.io.BufferedReader R = new java.io.BufferedReader
        (new java.io.InputStreamReader(System.in));
        //String st = R.readLine();
        String st = "10101010";
        if (isPeriodic(st) == false) {
            System.out.println(" Non Periodic");
        }
            else  {
                System.out.println("Periodic");
            }
    }

    private static boolean isPeriodic(String s)
    {
        String temp = s;
        int i;
        boolean pflag = false;
        for ( i = 1; i <= (s.length()/2); i  ) {
            s = rotateNltr(s,i);
            if (s == temp) {
                pflag = true;
                break;
            }
        }
        return pflag;
    }



    private static String rotateNltr(String s, int n) {
        if( n > s.length()) {
            return null;
        }
        for ( int i = 0; i < n; i  ) {
            s = leftRotatebyOne(s);
        }
        //System.out.println(s);
        return s;
    }
    private static String leftRotatebyOne(String s) {
        char[] temp = s.toCharArray();
        char t = temp[0];
        for ( int i = 0 ; i < s.length()-1 ;i   ) {
            temp[i] = temp [i 1];
        }
        temp[s.length()-1] = t;
        String r = new String(temp);
        //System.out.println(r);
        return r;
    }

}
  

Ответ №1:

Вы не можете сравнивать объекты (и это включает строки) с == . Вы должны использовать equals метод.

Ответ №2:

В отличие от C (который, я полагаю, является вашим предпочтительным языком) Java не позволяет сравнивать строковые объекты с оператором == . Используйте метод equals для сравнения строк.

 if (s.equals(temp)) {
    pflag = true;
    break;
  }
  

Ответ №3:

В вашем isPeriodic() проверка, которую вы выполняете, неверна. Сделайте это, как показано ниже:

   if (s.equals(temp)) {
    pflag = true;
    break;
  }
  

Ответ №4:

s.equal (temp) сам по себе проблему не решит, да, это заставит код корректно выполняться для входных данных, как указано в методе Main, но для 1010, 1011 этого не произойдет.

Попробуйте использовать этот метод :

 private static boolean isPeriodic(String s) {
    String temp = s;
    int i;
    boolean pflag = false;
    for (i = 1; i <= (s.length() / 2); i  ) {
        s = leftRotatebyOne(s);
        if (s.equals(temp)) {
            pflag = true;
            break;
        }
    }
    return pflag;
}
  

Это гарантирует, что для всех комбинаций эта программа работает.