Проблема, использовав Scanner#nextLine (); внутри for

Вопрос состоит в том, что я хочу ввести в компьютер String, который мог бы содержать место (ej: Соединенные Штаты) и по этой причине я использую nextLine, но также в этом же самом методе я ввожу в компьютер данные тип Int. Проблема состоит, в том, что после того, как находится внутри for во втором вводе информации, он накрывается из-за темы nextLine.

Введите имя страны в компьютер: Соединенные Штаты Ввели количество жителей В компьютер: 300

И после последуй за этим:

Введите имя страны в компьютер: Введите количество жителей в компьютер:

Я оставляю им код, у него было подумавший возможное решение (делать налоги по отдельности но окончательно не очень идет спрашивать 2 вещи по отдельности). PD: Предположитесь, что вектор - N количество вместо 5.

import java.util.Scanner;

public class Problema {
private Scanner teclado;
private String[] paises;
private int[] habitantes;

public void cargar() {
    teclado = new Scanner(System.in);
    paises = new String[5];
    habitantes = new int[5];
    System.out.println("Carga de paises y cant de habitantes!");

    for(int f = 0; f < paises.length; f++) {
        System.out.print("Ingrese nombre de país: ");
        paises[f] = teclado.nextLine();
        //teclado.nextLine();
        //paises[f] = teclado.nextLine();
        System.out.print("Ingrese la cantidad de habitantes: ");
        habitantes[f] = teclado.nextInt();
    }
}

public void ordenarAlfabeticamente() {
    for(int k = 0; k < paises.length-1; k++) {
        for(int f = 0; f < paises.length-1-k; f++) {
            if(paises[f].compareTo(paises[f+1]) > 0) {
                String auxpaises;
                auxpaises = paises[f];
                paises[f] = paises[f+1];
                paises[f+1] = auxpaises;
                int auxhabitantes;
                auxhabitantes = habitantes[f];
                habitantes[f] = habitantes[f+1];
                habitantes[f+1] = auxhabitantes;
            }
        }
    }
}

public void ordenarHabitantes() {
    for(int k = 0; k < habitantes.length-1; k++) {
        for(int f = 0; f < habitantes.length-1-k; f++) {
            if(habitantes[f] < habitantes[f+1]) {
                int auxhabitantes2;
                auxhabitantes2 = habitantes[f];
                habitantes[f] = habitantes[f+1];
                habitantes[f+1] = auxhabitantes2;
                String auxpaises2;
                auxpaises2 = paises[f];
                paises[f] = paises[f+1];
                paises[f+1] = auxpaises2;                   
            }
        }
    }
}

public void imprimirA() {
    System.out.println("Nombres de paises en orden alfabeto y sus habitantes: ");
    for(int f = 0; f < paises.length; f++) {
        System.out.println(paises[f] + " - " + habitantes[f]);
    }
}

public void imprimirB() {
    System.out.println("Nombres de paises y habitantes ordenado de mayor a menor: ");
    for(int f = 0; f < habitantes.length; f++) {
        System.out.println(paises[f] + " - " + habitantes[f]);
    }
}

public static void main(String[] ar) {
    Problema prob = new Problema();
    prob.cargar();
    prob.ordenarAlfabeticamente();
    prob.imprimirA();
    prob.ordenarHabitantes();
    prob.imprimirB();
}
}
10
задан 16.01.2017, 21:25
3 ответа

Проблема - что:

habitantes[f] = teclado.nextInt();

Он не достает буфера teclado изменение линии, из-за которого вызов в:

paises[f] = teclado.nextLine();

Найди как первый характер вместо линии и он это берет как пустая линия

Есть два способа это решать:

Тратя изменение линии с одним teclado.nextLine() после teclado.nextInt();

for(int f = 0; f < paises.length; f++) {
    System.out.print("Ingrese nombre de país: ");
    paises[f] = teclado.nextLine();
    //teclado.nextLine();
    //paises[f] = teclado.nextLine();
    System.out.print("Ingrese la cantidad de habitantes: ");
    habitantes[f] = teclado.nextInt();
    teclado.nextLine()  // Esto quitará del buffer el cambio de línea
}

Читая число как String и потом parsearlo в Integer

for(int f = 0; f < paises.length; f++) {
    System.out.print("Ingrese nombre de país: ");
    paises[f] = teclado.nextLine();
    //teclado.nextLine();
    //paises[f] = teclado.nextLine();
    System.out.print("Ingrese la cantidad de habitantes: ");
    habitantes[f] = Integer.parseInt(teclado.nextLine()); //Esto extrae el número como String pero luego lo parsea como `Integer`
}

Нужно выделять, что вероятно в обоих случаях было лучше включать чтение числа внутри одного try catch уже оба не удадутся в случае была введена в компьютер цепь, которая не представляла бы число.

14
ответ дан 24.11.2019, 14:58
  • 1
    Спасибо, используйте первый opci и # 243; n. – Popplar 20.01.2016, 08:43

То, что он бьет козырем, является чтением целых чисел, так как ты используешь тот же scanner, что ты можешь делать, состоит в том, чтобы использовать тот же nextLine (), и преобразовывать это в целое число.

Меняет эту линию

habitantes[f] = teclado.nextInt();

на эту линию

habitantes[f] = Integer.parseInt(teclado.nextLine());
2
ответ дан 24.11.2019, 14:58

Хороший уже я решил тебе проблему. То, что он перемещал, состоит в том, что в момент ввождения стоимости в компьютер в переменной жителей ты не отлаживал буфер, и следующее поле, которое было текста, признавало это не действительным полем. Далее я оставляю тебе код и результаты консоли, надеюсь, что он ты помогает, только ты должен упорядочивать данные для того, чтобы он оказался более эстетическим, привет.

package ayuda;
import java.util.Scanner;

public class Paises_habitantes {

  public static void main(String[] args) {
    Scanner c = new Scanner(System.in);

    String [] paises = new String[5];
    int [] habitantes = new int[5];

    System.out.println("carga de paises y cantidad de habitantes");

    for (int f=0;f<5;f++){
        System.out.print("Ingrese nombre del pais: ");
        paises[f]=c.nextLine();
        System.out.print("Ingrese la cantidad de haitantes: ");
        habitantes[f]=c.nextInt();
        c.nextLine(); //se utiliza para limpiar el buffer del teclado por variables int aqui estaba tu error
    }
    for(int x=0;x<5;x++){
        System.out.println("Mostrando resultados de captura: ");
        System.out.println("Pais: "+paises[x]+" Numero de habitantes: "+habitantes[x]);
    }
  }
}

Результаты консоли:

нагрузи стран и количества жителей
Введите имя страны в компьютер: mexico
Введите количество haitantes в компьютер: 80000000
Введите имя страны в компьютер: Соединенные Штаты
Введите количество haitantes в компьютер: 100000000
Введите имя страны в компьютер: alemania
Введите количество haitantes в компьютер: 60000000
Введите имя страны в компьютер: rusia
Введите количество haitantes в компьютер: 50000000
Введите имя страны в компьютер: inglaterra
Введите количество haitantes в компьютер: 3000000
Показывая результаты задержания:
Страна: mexico Я Нумерую жителей: 80000000
Показывая результаты задержания:
Страна: Соединенные Штаты Пронумеровали жителей: 100000000
Показывая результаты задержания:
Страна: alemania Я Нумерую жителей: 60000000
Показывая результаты задержания:
Страна: rusia Я Нумерую жителей: 50000000
Показывая результаты задержания:
Страна: inglaterra Я Нумерую жителей: 3000000

1
ответ дан 24.11.2019, 14:58