For in an ArrayList of Java Objects

0

I'm studying Java and I'm having a problem with a code I wrote. Home I need to read the name and age of 3 people and say the name of the youngest and the name of the oldest. Home I know the best way for a large number of people would be to use two loops for sorting, but I just did a few simple validations with if/else just to complete the exercise, but my mistake is happening in the loop I created to read 3 name and 3 ages of the keyboard. Home The code gives InputMismatchException always on the second loop.

Can anyone help me?

import java.util.Scanner;
import java.util.ArrayList;

public class Exercicio2 {

    static class Pessoa{
        String nome;
        int idade;
        Scanner input = new Scanner(System.in);

        public void setNome(){
            System.out.println("Insira o nome:");
            nome = input.next();
            input.nextLine();

        }

        public void setIdade(){
            System.out.println("Insira a idade:");
            idade = input.nextInt();
            input.nextLine();
        }
        }

    static public void main(String[] args){
        ArrayList<Pessoa> pessoa = new ArrayList<Pessoa>();
        Pessoa p = new Pessoa();
        Pessoa aux = new Pessoa();
        int i = 0;
        int j = 0;

        for(i = 0; i< 3; i++){
            p.setNome();
            p.setIdade();
            pessoa.add(i,p);
            System.out.println( pessoa.toString() );
            System.out.println( pessoa.size() );
        }

        for(i = 0; i < 3; i++){
            for(j = 0; j < 3; j++){
                if(pessoa.get(i).idade > pessoa.get(j).idade){
                    aux.idade = pessoa.get(i).idade;
                    pessoa.get(i).idade = pessoa.get(j).idade;
                    pessoa.get(j).idade = aux.idade;
                }
            }
        }
        System.out.println(pessoa.get(i).nome + " é a pessoa mais nova e " +     pessoa.get(j).nome + " é a mais velha.");
    }
}
    
asked by anonymous 23.03.2015 / 14:45

2 answers

1

Dude, this is it. I made a quickie here because I'm a bit clingy. But if I understood your problem well, what you need is in this code here. It may be that you find some syntax error, it is because it does not practice everyday development, especially in Java.

But I hope it helps, hug!

import java.util.Scanner;
import java.util.ArrayList;

public class Exercicio2 {

  static class Pessoa{

    private String nome;
    private int idade;
    private Scanner input = new Scanner(System.in);

    public void setNome(){

        System.out.println("Insira o nome:");
        nome = input.nex();
        System.out.println();
    }

    public void setIdade(){
        System.out.println("Insira a idade:");
        idade = input.nextInt();
        System.out.println();
    }

    public String getNome()
    {
        return this.nome;
    }

    public int getIdade();
    {
        return this.idade;
    }

    }

static public void main(String[] args){

    ArrayList<Pessoa> pessoa = new ArrayList<Pessoa>();

    Pessoa p;

    int i = 0;
    int j = 0;

    for(i = 0; i< 3; i++){

        p=new Pessoa();
        p.setNome();
        p.setIdade();
        pessoa.add(p);
    }

    for(i = 0; i < 3; i++){

        for(j = 1; j <= 3; j++){

            if(pessoa[i].getIdade()>pessoa[j].getIdade())
            {
                Pessoa aux;
                aux=pessoa[i];
                Pessoa[i]=pessoa[j];
                pessoa[j]=aux;
            }
        }
    }

    System.out.println(pessoa[0].getNome() +" é a pessoa mais nova e "pessoa[2].getNome()+ "é a pessoa mais velha.")
  }
}
    
23.03.2015 / 16:58
1

In fact, the exception thrown is a IndexOutOfBoundsException when you try to access the indexes with the value of the variables i and j on the penultimate line:

System.out.println(
    pessoa.get(i).nome + " é a pessoa mais nova e " +
    pessoa.get(j).nome + " é a mais velha."
);

Both variables have a value of 3. And this happens at this point:

for(i = 0; i < 3; i++){
   for(j = 0; j < 3; j++){
   }
   // saiu do loop porque j = 3
}
// saiu do loop porque i = 3

Your ArrayList has 3 people, but the index in the array goes from 0 to 2 [0|1|2] . When you try to access index 3 that does not exist, chaos falls on Earth the exception is thrown.

To solve, you can simply subtract 1 from the value contained in i and j . Ex:

System.out.println(
     pessoa.get(i - 1).nome + " é a pessoa mais nova e " +
     pessoa.get(j - 1).nome + " é a mais velha."
);

And then, your IndexOutOfBoundsException is resolved.

However you still have a logic problem in the program, the tests that I did always return the last person entered, both for the oldest and the youngest. Since I did not understand what you tried to do in that loop , here is another way to solve:

I've tried giving names that describe variables to avoid crowding the comment code.

import java.util.*;

public class Exercicio2 {

    private static final int PESSOAS = 3;
    private static Scanner input;

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

        ArrayList<Pessoa> listaDePessoas = new ArrayList<>();
        for(int i = 0; i < PESSOAS; i++){
            Pessoa novaPessoa = new Pessoa();

            System.out.println("Nome: ");
                novaPessoa.setNome(input.nextLine());
            System.out.println("Idade: ");
                novaPessoa.setIdade(input.nextInt());
            input.nextLine();
            listaDePessoas.add(novaPessoa);
        }

        Pessoa maisNova, maisVelha;
        maisNova = maisVelha = listaDePessoas.get(0);

        for(Pessoa pessoa:listaDePessoas){
            if(pessoa.getIdade() > maisVelha.getIdade())
                maisVelha = pessoa;
            else if(pessoa.getIdade() < maisNova.getIdade())
                maisNova = pessoa;
        }

        System.out.printf("Mais nova: %s - %d", maisNova.getNome(), maisNova.getIdade());
        System.out.printf("Mais velha: %s - %d", maisVelha.getNome(), maisVelha.getIdade());         
    }

    static class Pessoa {
        int idade;
        String nome;

        public void setIdade(int idade) {
            this.idade = idade;
        }

        public void setNome(String nome) {
            this.nome = nome;
        }

        public int getIdade(){ return idade; }
        public String getNome(){ return nome; }
    }
}


About InputMismatchException problem (which is not the real reason for code to work incorrectly): This is an exception thrown when the input value does not match the expected type or is not in the range of the expected type. At the time of entering the data there may have been a confusion and you reversed the order of entry, for example, your nextInt method was expecting to receive a number referring to age and ended up receiving a String containing the person's name. p>

I'm not aware if a Scanner object can save garbage from a previous read, but it's also something to check.

    
23.04.2015 / 09:08