Неправильное использование для цикла

In the following code the for loop is never executed. I have attempted to fix the problem with breakpoints and watches. The correct length for the cipher text is returned, however the for loop does not increment until int i >= ciphertext.length(). In fact, nothing seems to execute past the 'Debug' message.

private void decrypt_btnActionPerformed(java.awt.event.ActionEvent evt) {                                            


    String alphabet= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    String ciphertext="fRcXFBxXTRJ";


    status_label.setText( "Decryption has begun" );

    JOptionPane.showMessageDialog(null,"ciphertext-length: " + ciphertext.length() + "\n" + ciphertext,"Debug", JOptionPane.INFORMATION_MESSAGE);

    for (int i = 0; i>=ciphertext.length(); i--){

        System.out.println("inc:" + i);

        String cipher_current_char = getLetterAtIndex(ciphertext, i);
        int pos_char_in_alphabet = getIndexAtLetter(alphabet, cipher_current_char);


        if(pos_char_in_alphabet-2<0){

            plain_ta.setText(getLetterAtIndex(alphabet, (alphabet.length()+(pos_char_in_alphabet -2)+1 ) ));

            status_label.setText( 100/i + "%");



        }else{

            cipher_current_char = getLetterAtIndex(ciphertext, i);

            pos_char_in_alphabet = getIndexAtLetter(alphabet, cipher_current_char);

            plain_ta.setText(getLetterAtIndex(alphabet, (pos_char_in_alphabet-2)));

            status_label.setText( 100/i + "%");

        }
    }
}                          
0
nl ja de
Научитесь использовать отладчик. :-) Однажды установка точки останова в инструкции if и рассмотрение значений, когда она была удалена, объяснила бы проблему, с которой вы столкнулись.
добавлено автор Ken White, источник

4 ответы

for (int i = ciphertext.length()-1; i>=0; i--){

Вам нужно работать в обратном направлении. Также обратите внимание на -1 , вам нужно, чтобы избежать исключений из-за ограничений (индексы начинаются с 0 и переходят к length -1 ).

Всегда следите за своей петлей громко с бумагой и карандашом, когда вы застреваете, это всегда помогает.

7
добавлено
Не будет> = 0 сделать это -1?
добавлено автор Lews Therin, источник
О да, я забыл об этом .. kwl
добавлено автор Lews Therin, источник
В противном случае проверка происходит до фактического выполнения остальной части цикла и уменьшения. Как и в: i> = 0? Да, выполните тело цикла, уменьшите i, снова проверьте и т. Д.
добавлено автор A--C, источник
for (int i = ciphertext.length()-1; i > 0; i--){

Вам нужно отменить это условие, иначе логика ошибочна.

3
добавлено
Вы по очереди; длина length() - это один конец.
добавлено автор Richard, источник

Прежде всего, я настоятельно рекомендую вам научиться использовать отладчик IDE. Вы также должны узнать, как добавить System.out.println() призывы к вашему коду для целей отладки.

С учетом сказанного давайте посмотрим на цикл for:

for (int i = 0; i>=ciphertext.length(); i--)

Допустим, вы достигли цикла for, а ciphertext имеет длину 10. i инициализируется до нуля. Затем проверьте состояние, если оно больше, чем или равно 10. Нет, это не так, поэтому цикл for for пропускается.

Обратите внимание, что условие цикла for должно быть истинным для продолжения цикла. Для остановки цикла for используется not .

Поэтому мы можем решить эту проблему:

for (int i = 0; i<=ciphertext.length(); i--)

Теперь цикл for начинается с i в 0. Это меньше или равно 10, поэтому цикл выполняется. i уменьшается до -1, что опять меньше или равно 10. Цикл выполняется, а i уменьшается до -2 ...

Я вижу здесь образец. Цикл не остановится. Нам нужно сделать другое изменение:

for (int i = 0; i<=ciphertext.length(); i++)

Теперь i увеличивается с 0 до 10. Однако, когда i равно 10, вы получите исключение. Это связано с тем, что единственные допустимые индексы от 0 до 9 . Последнее исправление изменит проблему:

for (int i = 0; i
1
добавлено
i>=ciphertext.length()

должно быть

i < ciphertext.length()
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async