#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;
}
Это гарантирует, что для всех комбинаций эта программа работает.