в основном, я хочу попробовать средство для сохранения постоянства, и я новичок в кодировании Java, поэтому я все еще использую графический интерфейс NetBeans для кодирования (я знаю), но мне нужна помощь, чтобы заставить его работать. Приложил мои усилия ниже. Графический интерфейс — это просто текстовое поле, которое принимает ввод, и кнопка с заданным кодом. Если бы кто-то мог помочь, это было бы здорово. Заранее спасибо.
Ошибка, которую я продолжал получать, была: Исключение в потоке "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 4 (4 — длина числа, которое я ввел. Соответственно оно менялось)
long num1=Long.parseLong(jTextField1.getText());
String num2=jTextField1.getText();
char s1;
int pers=1,temp;
for(int i=1;i<=num2.length();i++)
{
s1=num2.charAt(i);
temp=Character.getNumericValue(s1);
pers*=temp;
if (pers==0)
{
System.out.println(i);
break;
}
}
String num2=jTextField1.getText();
String test=num2;
char s1;
int pers=num2.length(),temp=1,i,n=0;
do
{
for(i=0;i<pers;i++)
{
s1=test.charAt(i);
temp=temp*(Character.getNumericValue(s1));
}
test=Integer.toString(temp);
temp=1;
} while(test.length()>1);
System.out.println(n);
Final working code:
long r1=Long.parseLong(jTextField1.getText());
String s=jTextField1.getText(),s1 = "";
long r=1;
int i=0;
char[] gfg=s.toCharArray();
do
{
for (char ch : gfg)
{
r *= Character.digit(ch, 10);
}
s1=Long.toString(r);
gfg=s1.toCharArray();
System.out.println(r);
r=1;
}while(s1.length()!=1);
Я знаю, что все говорят, что от 0 до <длины, но я ввел от 1 до <= длины, разве это не означает, что цикл повторяется столько же раз, сколько от 0 до <длины?
Компьютеры считают с 0. Таким образом, вызов String.charAt(0)
вызывает первый символ строки. Вызов array[0]
вызывает первый индекс массива. Ваш IndexOutOfBoundsException
можно легко остановить, заменив for(int i=1; i<=num2.length(); i++){
на for(int i=0; i<num2.length(); i++){
Ну ладно я помню, что сейчас внесу соответствующие изменения. Спасибо
Ваш ввод уже является String
, преобразуйте его в char[]
и используйте цикл for-each
. Нравиться,
int r = 1;
for (char ch : jTextField1.getText().toCharArray()) {
r *= Character.digit(ch, 10);
}
В качестве альтернативы допустимы индексы от 0
(включительно) до length
(исключительно). Итак, ваша петля for
должна выглядеть так:
int i=1;i<=num2.length();i++
должно быть
int i=0; i < num2.length(); i++
Основываясь на вашем комментарии ниже, что вам нужно сделать это дважды, я бы извлек логику в метод и дважды вызвал его. Нравиться,
private static int multiplyDigits(int r) {
int t = 1;
while (r > 0) {
t *= r % 10;
r /= 10;
}
return t;
}
А потом
String str = "4544";
System.out.println(multiplyDigits(multiplyDigits(Integer.parseInt(str))));
можете ли вы подробно объяснить, для чего нужны начальные строки кода? Я ввел их в графический интерфейс и ввел 4544 в jTextField1, а r было 320. Я не понимаю...
Но 4*5*4*4 — это 320. Чего ты ожидал?
Я думаю, он хотел объяснений..? Я не знаю лично.
Но затем мне нужно, сколько раз требуется, чтобы умножение достигло 0. Итак, я снова помещаю это в цикл и использую другую переменную для подсчета количества раз?
@FallingCoder да, объяснение было бы хорошим, но я все равно его понял. Спасибо. Хотя другой вопрос, который я задал, все еще беспокоит меня. Нужно ли мне помещать этот цикл for в другой?
@AmaanShaikh Нет. Зачем вам нужен вложенный цикл?
@ElliottFrisch вложенный цикл, потому что 4 * 5 * 4 * 4 дает мне 320, но это не то, что мне нужно .... Мне нужен вывод как 2, потому что 4 * 5 * 4 * 4 = 320, тогда 3 * 2 * 0 = 0 так 2 шага
@ElliottFrisch, ваш отредактированный метод работает, но только если я знаю, сколько раз функция должна повторяться.
@AmaanShaikh В следующий раз, когда вы зададите вопрос, пожалуйста включите все актуально подробности в вопроса.
Мне жаль. Честно говоря, я не могу найти ошибку в последнем коде, и я точно не знаю, почему. Ваш метод работает, но недостаточно :\
@ElliottFrisch, ваш код сработал ... хотя мне пришлось его сильно подправить .... Я добавлю его в вопрос, чтобы вы могли посмотреть на шедевр, который вы помогли создать. Хотя я, конечно, не игнорирую помощь и предложения FallingCoder. Большое спасибо вам обоим. Ваше здоровье
Простой способ исправить данную ошибку прост.
Компьютеры считают с 0. Таким образом, вызов String.charAt(0)
вызывает первый символ строки. Вызов array[0]
вызывает первый индекс массива. Вызов String.charAt(1)
или array[1]
вызывает элемент второй.
Ваше исключение IndexOutOfBoundsException можно легко остановить, изменив
for(int i=1; i<=num2.length(); i++){
к for(int i=0; i<num2.length(); i++){
Причина, по которой ваш код выдает ошибку:
Когда цикл начинается, ваш код пропускает первый символ.
В последней итерации цикла for, где i == num2.length()
вызывает проблему, потому что вы пытаетесь вызвать несуществующий символ Н+1th строки, в то время как длина составляет всего Н.
Причина, по которой ваш отредактированный код вызывает ошибку, заключается в том, что в строке test=Integer.toString(temp);
вы делаете test
меньшим числом. (Наверное)
Допустим, num2
было 989. Test = num2
и pers = num2.length(), which is 3
Это важно.
После этой строки test=Integer.toString(temp);
тест становится 9
. (как строка)
Помните, что test
— это всего лишь одна length 1
цифра? Что ж, в следующей итерации цикла do while внутри цикла for i
to pers
равно 0
to 3.
Однако, опять же, test
— это всего лишь одна цифра, длина которой равна 1.
В цикле for попробуйте добавить System.out.println(test.charAt(i))
.
Самая важная часть кода — это логика, стоящая за ним. Если вы потеряли код, который вы набрали, но сохранили план его создания, вы можете снова сфабриковать код. Если вы забудете логику, лежащую в основе кода, и ваш учитель попросит вас объяснить ее, вы начнете с нуля.
Логика вашего кода (как описано в заголовке) для умножения каждой цифры в числе такова.
Введите String
Make COUNT integer, equal to 1
Loop: (Use String like char[] array)
Call String.charAt(int)
Parse String.charAt(int)
COUNT (<<placeholder name) *= parsed integer (valueOf returns the Integer wrapper class, you used int instead)
End loop
Print result
Разница между parseInt и valueOf в java?
да. Это верно. Проанализируйте мое «исправление» вашего кода.
В общем, я последовал совету как от @FallingCoder, так и от Эллиотта, и я сделал две отдельные кнопки, содержащие каждый из ваших кодов, и без обид, Эллиотт, но ваш не мог обрабатывать большие числа, в то время как от 0 до <length работал: P Спасибо вам обоим. Кроме того, как новый пользователь, я был удивлен тем, как быстро пришли ответы. Продолжайте в том же духе, ребята. :)
Хотя может показаться, что для получения просмотров вашего вопроса потребуется не менее часа, на самом деле это займет всего около 5 секунд или около того.
Ребята, я знаю, что после всего этого я не должен вас беспокоить, но не могли бы вы помочь мне найти ошибку в этом... Я получаю ту же ошибку, что и раньше.
Строка num2=jTextField1.getText(); Проверка строки = число2; символ s1; int pers=num2.length(),temp=1,i,n=0; do { for(i=0;i<pers;i++) { s1=test.charAt(i); temp=temp*(Character.getNumericValue(s1)); } test=Integer.toString(temp); темп=1; } пока(test.length()>1); Система.out.println(n);
подожди, я вставлю это в вопрос
@FallingCoder Я добавил новый фрагмент внизу вопроса. Пожалуйста помоги.
В чем проблема?
@FallingCoder та же ошибка, что и раньше. Постоянство работает для чисел, содержащих ноль, и дает результат как 1, но для любого другого числа, например 235, вместо того, чтобы давать 2, он просто снова выдает эту ошибку Исключение в потоке «AWT-EventQueue-0» java.lang.StringIndexOutOfBoundsException: Индекс строки вне допустимого диапазона: 2
В вашем коде test.length()
никогда не меняется. Однако мне не удалось найти источник ошибки.
@FallingCoder, но тест меняется на temp правильно, так что я думаю, меняется длина
Я понял теперь. Я не понимаю, почему вы изменили test
, чтобы фактически быть одним персонажем. Источник проблемы кроется в том, что pers
не меняет с участиемtest
. В результате, когда вы вызываете test.charAt(Anything above 0)
, создается исключение IndexOutOfBounds. Почему? Поскольку test
изменился на один символ, и вы вызываете test.charAt(pers)
, где pers
, вероятно, больше 0. Поскольку test.charAt(0)
является первым символом, а test.charAt(>0)
вызывает несуществующие символы, это вызывает эту ошибку. (Эта строка меняет его: test=Integer.toString(temp);
)
@FallingCoder подождите, почему люди должны постоянно меняться? pers используется только в цикле for и больше нигде. Кроме того, в моем коде это test.charAt(i), и если я прав, я иду от 0 к длине, как вы упоминали ранее. Итак, я не вижу, где закрадывается ошибка outofbounds...
Допустим, num2
равно «12». pers
тогда будет 2. Вы входите в цикл do-while, а затем в цикл for. s1 = temp.charAt(i)
. Это не выдает ошибку, потому что i=0
и test
равно "12". s1 = '1'
. temp *= 1
. Следующая итерация цикла for: temp *= 2
. Ошибок пока нет. После цикла for вы вызываете test=Integer.toString(temp);
который изменяет test на один символ., поэтому test
будет 1
. (Строка) Поскольку pers
равно 2
, а test.length()
будет 1
, вызов s1=test.charAt(i);
вызовет ошибку. В частности, StringIndexOutOfBoundsException
.
Думать. Я дал вам полное объяснение. Если вы не можете этого сделать, то я поверю, что вы скопировали половину этого из Интернета.
Я не слышал, но я знаю, что это может звучать так. Хотя ваше объяснение имеет смысл, я действительно не понимаю ту часть, где вы объясняете, почему вторая итерация вызывает ошибку StringIndexOutOfBoundsException. Кроме того, я не могу выразить это достаточно, но я действительно благодарен вам за терпение со мной. Я все еще манекен, так что спасибо. :)
Я полностью переписал свое объяснение и поместил его в свой ответ. Больше переписывать не буду, да и редактировать не хочу.
@FallingCoder Я попробую ввести i<test.length() вместо pers и посмотреть, сработает ли это. Спасибо :)
посмотрите на окончательный рабочий код, который я добавил в вопрос
Зачем нужен цикл do-while?
Строки в Java идут от 0 до длины-1, а не от 1 до длины.