2017-02-08 8 views
0

Это проект для школы. Цель состоит в том, чтобы создать программу, которая считывает вход пользователя, а затем сокращает этот ввод, произвольно удаляя символы, пока не достигнет 140 символов. Вот что я сделал до сих пор. В настоящее время он удаляет только один символ и затем перестает работать. Спасибо за любые советыУдалить случайные символы из строки

import java.util.Scanner; 
import java.util.Random; 

public class Main { 

public static void main(String[] args) { 

     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Enter the tweet you want to shorten:"); 
     String tweet = null; 

     tweet = keyboard.nextLine(); 

     int tweetLength = tweet.length(); 

     Random rand = new Random(); 


     do { 

     } while (tweetLength <= 140); { 
      int characterposition = rand.nextInt(tweetLength); 
      String shorttweet = tweet.substring(0, characterposition-1); 
      String shorttweet2 = tweet.substring(characterposition); 

      tweet = shorttweet + shorttweet2; 
      System.out.println("Shortented Tweet: " + tweet); 
      tweetLength = tweet.length(); 

     } 
+1

Вау, это впечатляющий цикл ... – shmosel

ответ

1

Формат вашей петли неправильный. Вы должны использовать:

public static void main(String[] args) { 

    Scanner keyboard = new Scanner(System.in); 
    System.out.println("Enter the tweet you want to shorten:"); 
    String tweet = null; 

    tweet = keyboard.nextLine(); 

    int tweetLength = tweet.length(); 

    Random rand = new Random(); 

    while (tweetLength > 140) { 
     int characterposition = rand.nextInt(tweetLength); 
     String shorttweet = tweet.substring(0, characterposition); 
     String shorttweet2 = tweet.substring(characterposition + 1); 

     tweet = shorttweet + shorttweet2; 
     System.out.println("Shortented Tweet: " + tweet); 
     tweetLength = tweet.length(); 
    } 

То, что вы были до этого был пустой do-while цикла следует один блок кода, который был, почему он происходит только один раз. Обратите внимание, что я также изменил условие цикла: мы должны зацикливаться, пока длина больше 140, а не меньше.

Для целей обучения, ниже исходный цикл:

do { 
    //you didn't do anything inside the loop! 
} while (tweetLength <= 140); 

//all of your code was after the loop 

Edit:

Мы также необходимо исправить эту строку rand.nextInt(tweetLength), потому что будет возвращать int между 0 (включительно) и tweetLength (эксклюзив). Когда это вернет 0, следующая строка сломается, потому что вы вызываете substring(0, -1). Благодаря PatrickParker для этой точки

+0

ваша позиция отключена по одной. это может привести к java.lang.StringIndexOutOfBoundsException, когда nextInt возвращает 0. –

+0

@PatrickParker хорошая точка, исправлена. – nhouser9

+0

нет, вы просто не смогли удалить первый символ. –

1

Вы бы лучше заменить String на StringBuilder, что гораздо быстрее, для этого вида операций:

private static String shorten(String str, int length) { 
    StringBuilder sb = new StringBuilder(str); 
    Random rand = new Random(); 
    while (sb.length() > length) { 
     int pos = rand.nextInt(sb.length()); 
     // The deleteCharAt() method deletes the char at the given 
     // position, so we can directly use the retrieved value 
     // from nextInt() as the argument to deleteCharAt(). 
     sb.deleteCharAt(pos); 
    } 
    return sb.toString(); 
} 

Чтобы ответить на ваш вопрос:

Вы используете цикл do-while, который имеет этот формат:

do { 
    // Things to do 
} while (condition); 

Ваш блок за этим фрагментом кода не имеет ничего общего с этим циклом. Это просто блок анонимный код:

{ 
    // Statements 
} 

Так первый ваш пустой do-while цикл выполняется, а затем код под ним - один раз, конечно.

Вы должны использовать while петлю вместо:

while (lengthOfString > 140) { 
    // remove a character 
}