2015-03-08 1 views
0

В моем коде у меня есть пользователь, который вводит «количество названий». Затем я предлагаю пользователю ввести имена названий, пока он не будет равен количеству названий, которые пользователь вводил раньше. То, что я хочу сделать, это вернуть имена названий, когда я вызываю метод в моем основном методе. Но, когда я пытаюсь вернуть переменную, у меня есть то, что читает имена названий, к ней нельзя получить доступ, потому что она выходит из цикла. Вот этот метод:Как я могу возвращать вставки строк из цикла while?

public static String getTitles(){ 
    Scanner numberOfTitles = new Scanner(System.in); 
    System.out.println("Enter number of titles: "); 
    int titlesAmount = numberOfTitles.nextInt(); 
    int count = 1; 
    while (count <= titlesAmount){ 
     Scanner titlesReader = new Scanner(System.in); 
     System.out.println("Enter title: "); 
     String titlesInput = titlesReader.next(); 
     count++; 
    } 
    return titlesInput; 
} 

Я хочу, чтобы вернуть эту переменную titlesInput, потому что содержит имена, введенные пользователем, но я не знаю, как получить к нему доступ вне цикла. Был бы признателен, если бы кто-нибудь мог показать мне, как это сделать.

+2

метод, который возвращает строку может возвращать только ** один ** String. Вы хотите вернуть ** несколько строк **. Поэтому метод должен возвращать массив строк (или список ). Прочтите руководство по массивам: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html.Кроме того, вам нужен один сканер для чтения всего. Не нужно создавать новый сканер каждый раз, когда вы хотите что-то прочитать. –

ответ

0

Вам нужно вернуть список (или массив) строк, а не одну строку.

Я изменил свой метод, чтобы сделать это, чтобы вы могли получить общее представление о том, что я имею в виду. Я не уверен, что мой синтаксис на 100% правильный для Java, но он должен понять суть.

public static List<String> getTitles(){ 
    Scanner numberOfTitles = new Scanner(System.in); 
    System.out.println("Enter number of titles: "); 
    int titlesAmount = numberOfTitles.nextInt(); 
    int count = 1; 

    List <String> titles = new ArrayList<String>(); 

    while (count <= titlesAmount){ 
     Scanner titlesReader = new Scanner(System.in); 
     System.out.println("Enter title: "); 
     String titlesInput = titlesReader.next(); 
     titles.add(titlesInput); 
     count++; 
    } 
    return titles; 
} 
1

Если вы хотите вернуть несколько строк из метода, вы должны возвращать список строк:

public static List<String> getTitles() { ... } 

Затем, внутри метода, просто добавьте все строки, которые вы хотите, чтобы вернуться к списку, и возвращает список в конце:

Scanner inputReader = new Scanner(System.in); 
System.out.println("Enter number of titles: "); 
int titlesAmount = inputReader.nextInt(); 
int count = 1; 
List<String> titles = new ArrayList(); 

while (count <= titlesAmount){ 
    System.out.println("Enter title: "); 
    titles.add(inputReader.next()); 
    count++; 
} 
return titles; 

Обратите внимание, что я только создал один Scanner объект. Для этой задачи вам не нужно создавать несколько Scanner.

Но даже лучшее решение было бы иметь только один глобальный объект Scanner где-то вне метода и просто использовать его для всех ваших потребностей ввода.

+0

Хех, мы довольно много разместили тот же самый код. : D –

+0

@VeselinRomic Но я избил вас на 1 минуту;) – emlai

+0

И исправил проблему с несколькими сканерами. – csmckelvey

1

Вы должны определить переменную внутри области метода. Не в области while while, если вы хотите вернуть это. И всегда лучше не использовать прямые объекты String и манипулировать ими внутри циклов, так как это вызовет больше памяти. Лучше использовать StringBuilder или StringBuffer на основе вашего выбора

public static String getTitles(){ 
    Scanner scanner = new Scanner(System.in); 
    System.out.println("Enter number of titles: "); 
    int titlesAmount = scanner.nextInt(); 
    int count = 1; 
    StringBuilder sbReturn = new StringBuilder(); 
    while (count <= titlesAmount){ 
     System.out.println("Enter title: "); 
     sbReturn.append(scanner.next()).append(","); 
     count++; 
    } 
    return sbReturn.toString(); 
} 
+0

@Takendarkk oh Я забыл об этом. Я исправил это. Спасибо за комментарий и репутацию :) –

0

Для того, чтобы иметь область видимости переменной быть на внешнем уровне, необходимо инициализировать строку за пределами цикла. Компилятор не может точно знать, будет ли выполняться код внутри оператора while while (даже если условие истинно), поэтому он не пропускает никаких переменных в блоке цикла во внешний блок.

В дополнение к этому есть три вещи, которые вам нужно знать. Во-первых, вам нужен только один объект Scanner для чтения всего вашего ввода. Во-вторых, если вы хотите вернуть кучу строк, в этом случае все ваши заголовки, вам нужен объект List<String> в качестве вашего типа возврата. Наконец, всякий раз, когда вы хотите повторять x количество раз, цикл for всегда более читабельен, чем цикл while, который использует переменную счетчика.

Я хотел бы переписать код так:

public static List<String> getTitles() { 
    List<String> titles = new ArrayList<String>(); 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter number of titles: "); 
    int titlesAmount = sc.nextInt(); 
    for (int i = 0; i < titlesAmount; i++) { 
     System.out.println("Enter title: "); 
     titles.add(sc.next()); 
    } 
    return titles; 
} 
Смежные вопросы