#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]);
}
}
}