For in a Java Object Arraylist

Asked

Viewed 1,857 times

0

I am studying Java and I have a problem in a code I wrote.
I need to read the name and age of 3 people and say the name of the youngest and the name of the oldest.
I know the best way for a large number of people would be to use two loops for ordination, but I’ve only done a few simple validations with if/else just to complete the exercise, however, my mistake is happening in the loop I created to read 3 keyboard name and 3 ages.
The code gives a InputMismatchException always in the second round.

Can someone 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.");
    }
}
  • 1

    Cade the method Pessoa.getNome() ?

  • I edited the code and now I’m getting an Indexoutofboundsexception. Above, I put my edition.

2 answers

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 second to last line:

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

Both variables have value 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 upon the Earth the exception is made.

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 that’s it, your IndexOutOfBoundsException is resolved.

However you still have a logic problem in the program, in the tests I did is always returned the last person inserted, both for older age and for smaller. How did I not understand what you tried to do in that loop follows another way of solving:

I tried to give names that describe the variables, to avoid filling 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 the problem of InputMismatchException (which is not the real reason the code works incorrectly): This is an exception thrown when the input value does not match the expected type or is not in the expected type range. At the time of entering the data may have occurred a confusion and you reversed the input order, for example your method nextInt expected to receive a number referring to age and ended up receiving a String containing the name of the person.

I have no knowledge if an object Scanner can save trash from a previous reading, but it is also something to be checked.

1

Dude, here’s the thing. I made it quick because I’m a little bit stuck. But if I understand your problem, what you need is in this code here. It may be that you find some syntax error, it is because not practical development every day, mainly 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.")
  }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.