Проблема в том, что я хочу ввести строку, которая может содержать пробел (например, США), и по этой причине я использую nextLine, но также в том же методе я ввожу тип данных Int, Проблема в том, что внутри for in второй доход прикручен выдачей nextLine.
Введите название страны: United States Введите количество жителей: 300
И тогда это происходит:
Введите название страны: Введите количество жителей:
Я оставляю вам код, я подумал о возможном решении (выполнять нагрузки по отдельности, но определенно не очень хорошо спрашивать 2 вещи по отдельности). PS: Предположим, что вектор представляет собой количество 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();
}
}
Проблема в том, что:
Он не буферизует
teclado
перевод строки, поэтому вызов:Найдите в качестве первого символа разрыв строки и примите его как пустую строку
Есть два способа исправить это:
Потребление перевода строки с
teclado.nextLine()
послеteclado.nextInt();
Чтение числа как
String
и последующий анализ его наInteger
Следует отметить, что в обоих случаях, вероятно, лучше включить чтение числа внутри a,
try catch
так как оба не будут работать, если будет введена строка, не представляющая число.Что не удается, так это чтение целых чисел, поскольку вы используете тот же сканер, что вы можете сделать, так это использовать тот же nextLine() и преобразовать его в целое число.
изменить эту строку
для этой линии
Ну я решил проблему для вас. Случилось так, что при вводе значений в переменную Residents вы не очистили буфер и следующее поле, которое было текстовым, распознало его как недопустимое поле. Тогда оставляю вам код и результаты консоли, надеюсь вам поможет, осталось только заказать данные, чтобы выглядело более эстетично, привет.
Результаты консоли: