Выход из цикла, когда больше нет входных данных

#java #loops

#java #циклы

Вопрос:

Я пишу довольно простой java-код. Идея состоит в том, чтобы использовать цикл для записи до 20 чисел в массив. Я хочу выйти из цикла, когда не останется никаких значений. Прямо сейчас мой код будет записываться в массив, но я не могу заставить его выйти из цикла без ввода нецелочисленного значения. Я читал некоторые другие сообщения, но они, как правило, используют строковые методы, что сделало бы мой код немного громоздким. Я чувствую, что есть простое решение этой проблемы, но, похоже, я не могу его найти….

 import java.util.Scanner;

public class getArray{

   public static void main (String[] args){

   Scanner scnr = new Scanner(System.in);

   int[]newArray = new int[20];
   int newArraySize = 0;   

   while (scnr.hasNextInt()){
      newArray[newArraySize] = scnr.nextInt();
      newArraySize  = 1;
      continue;
      }

   for (int i = 0; i < newArraySize; i  ){
   System.out.println("The "   i   " input is "   newArray[i]);
   } 
 }
}
  

Комментарии:

1. Как насчет добавления этого? while (scnr.hasNextInt() amp;amp; newArraySize < 20)

2. Вам нужно вводить входные данные каждый раз или вы можете ввести все int за один раз, например; 12 19 37 38 16?

3. Проблема в том, что легко определить, когда заканчивается файл, но для завершения нужно сделать что-то особенное System.in . Чтобы сообщить программе, что ввод завершен, введите элемент управления-d в начале новой строки. Тогда Scanner#nextLine вернет null .

4. @andersen Ввод может быть предоставлен всем одновременно

Ответ №1:

И еще одна альтернатива. Позволяет вводить одно числовое значение или несколько числовых значений, разделенных пробелами, например:

 --> 1
--> 2
--> 10 11 12 13 14 15 16
--> 20
--> 21
  

Ничего не вводите, чтобы завершить ввод данных и просмотреть содержимое массива:

 Scanner scnr = new Scanner(System.in);
List<Integer> valuesList = new ArrayList<>();
    
System.out.println("Enter all the  Integer values you would like");
System.out.println("stored into your int[] array.  You can enter");
System.out.println("them either singular or multiple values on a");
System.out.println("single line spaced apart with a single white"); 
System.out.println("space. To stop numerical entry and view your");
System.out.println("array contents just enter nothing.");
System.out.println("============================================");
System.out.println();
            
String inputLine = "";
while (inputLine.isEmpty()) {
    System.out.print("Enter a numerical value: --> ");
    inputLine = scnr.nextLine().trim();
    // If nothing is supplied then end the 'data entry' loop.
    if (inputLine.isEmpty()) {
        break;
    }
    //Is it a string line with multiple numerical values?
    if (inputLine.contains(" ") amp;amp; inputLine.replace(" ", "").matches("\d ")) {
        String[] values = inputLine.split("\s ");
        for (String vals : values) {
            valuesList.add(Integer.valueOf(vals));
        }
    }
    //Is it a string line with a single numerical value?
    else if (inputLine.matches("\d ")) {
        valuesList.add(Integer.valueOf(inputLine));
    }
    // If entry is none of the above...
    else {
        System.err.println("Invalid numerical data supplied ("   inputLine   ")! Try again...");
    }
    inputLine = "";
}
System.out.println("============================================");
System.out.println();
    
// Convert List<Integer> to int[]...
int[] newArray = new int[valuesList.size()];
for (int i=0; i < valuesList.size(); i  ) {
    newArray[i] = valuesList.get(i);
}
    
    
// Display the int[] Array
for (int i = 0; i < newArray.length; i  ) {
    System.out.println("The "   i   " input is "   newArray[i]);
}
  

Ответ №2:

Если я правильно понимаю, то вы хотите, чтобы ввод чисел был ограничен размером массива?

 public static void main(String[] args) {

    Scanner scnr = new Scanner(System.in);
    int[] newArray = new int[20];
    int newArraySize = 0;

    while (newArraySize < newArray.length amp;amp; scnr.hasNextInt()) {
        newArray[newArraySize] = scnr.nextInt();
        newArraySize  ;
    }

    for (int i = 0; i < newArraySize; i  ) {
        System.out.println("The "   i   " input is "   newArray[i]);
    }
}
  

Ответ №3:

Ваше while условие цикла должно быть до тех пор, пока newArraySize оно меньше фактического размера. Вот исправление с некоторыми изменениями:

 Scanner scnr = new Scanner(System.in);

int[]newArray = new int[20];
int newArraySize = 0;   

while (newArraySize < newArray.length){
    try {
        newArray[newArraySize] = scnr.nextInt();
        newArraySize  ;
    }catch(Exception e){
        scnr.nextLine();
    }
}

for (int i = 0; i < newArraySize; i  ){
    System.out.println("The "   i   " input is "   newArray[i]);
} 
  

Комментарии:

1. Это работает, если я использую все 20 пробелов. Есть ли способ, которым я мог бы остановиться в конце строки?

Ответ №4:

Решение с использованием Java Stream API:

 Scanner sc = new Scanner(System.in);
System.out.println("Input 20 numbers: ");

int[] arr = IntStream.generate(sc::nextInt) // create infinite stream generating values supplied by method `nextInt` of the scanner instance 
                     .limit(20)   // take only 20 values from stream
                     .toArray();  // put them into array

System.out.println(Arrays.toString(arr)); // print array contents at once
  

Кроме того, существует служебный метод Arrays.setAll , позволяющий устанавливать значения массива через IntUnaryOperator :

 int[] arr = new int[20];
Arrays.setAll(arr, (x) -> sc.nextInt());
  

Комментарии:

1. Не отклоняя это; однако я хотел бы высказать свое мнение: хотя это может сработать (не проверял), я думаю, просто использовать потоки, потому что они являются потоками, не лучший способ с точки зрения кодирования в целом. Иногда модные и умные вещи — это круто, но читаемость здесь для меня мертва … и переход на ванильный, олдскульный, базовый цикл — это то, что я бы предпочел этому решению.

Ответ №5:

Хотя цикл должен иметь условие для длины массива, пожалуйста, попробуйте приведенный ниже код, который перестанет принимать входные данные после 21-го ввода, и будут отображены элементы массива.

 import java.util.Scanner;

public class AarrayScanner {
    public static void main(String args[]) {
        Scanner scnr = new Scanner(System.in);
        int[] newArray = new int[20];
        int newArraySize = 0;
        while (scnr.hasNextInt() amp;amp; newArraySize < newArray.length) {
            newArray[newArraySize] = scnr.nextInt();
            newArraySize  ;
        }

        for (int i = 0; i < newArraySize; i  ) {
            System.out.println("The "   i   " input is "   newArray[i]);
        }
    }
}