Index returning -1 in Java Arraylist

Asked

Viewed 1,255 times

3

Good morning. For study purposes, I am making a simple application in Java RMI that simulates some operations (create account, check balance, debit etc.) on one or more accounts. For each account I create an object of the type Conta containing its number and balance and the storage in a ArrayList. The problem occurs when I need to retrieve a specific object in the array (using the account number as a parameter) to perform some operation (debit, credit, remove, etc...). I’m using the method contas.indexOf(numero) to return me the index of the array contas, but it always returns me the index -1.

If I pass some index, for example, Conta conta = contas.get(3), it returns me the object that is in that position. But I need the index according to the number given by parameter. I did some research and tried the form for (Conta busca : contas) but it didn’t work either, even though I used a if (busca.numero == numero). When I use this if, it always gives true, as if the number of all accounts were the same. And when I use if(busca.numero.equals(numero) netbeans shows an error in the statement.

Could someone help me?

Thank you.

import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Scanner;


public class ClienteStart {

    private static ArrayList<Conta> contas = new ArrayList<Conta>();
    private static int numero;
    private static double valor;       
    private static IFuncoesBanco Funcs;
    private static Scanner scanner;

    // Aqui será simulado o "menu"
    public static void listaMetodos() {
       System.out.println("/****************************************/");
       System.out.println("/* Sistema de Contas de banco */");
       System.out.println("/* Banco da Praça */");
       System.out.println("/****************************************/\n");
       System.out.println("Escolha uma opção:");
       System.out.println("1 => Inserir nova Conta");
       System.out.println("2 => Excluir Conta");
       System.out.println("3 => Debitar da Conta");
       System.out.println("4 => Creditar da Conta");
       System.out.println("5 => Consultar Conta");
       System.out.println("6 => Sair");
       System.out.println("Digite sua opção: ");
       System.out.println("/****************************************/");
    }

    // Aqui será o método a ser executado será escolhido
    // de acordo com a opção passada pelo teclado
    public static void executeMetodo(int opcao) {
        try
        {
            switch (opcao) {
            case 1:
                System.out.println("Função 'Inserir' escolhida.");
                inserir();
                break;
            case 2:
                System.out.println("Função 'Excluir' escolhida.");
                excluir();
                break;
            case 3:
                System.out.println("Função 'Debitar' escolhida.");
                debitar();
                break;
            case 4:
                System.out.println("Função 'Creditar' escolhida.");
                creditar();
                break;
            case 5:
                System.out.println("Função 'Consultar' escolhida.");
                consultar();
                break;
            case 6:
                System.out.println("Encerrado");  
                System.exit(0);
            default:
                System.out.println("Opção inválida");
                break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void inserir() throws RemoteException, NotBoundException {
        System.out.println("Digite o número da conta:");
        numero = scanner.nextInt();
        System.out.println("Digite o valor:");
        valor = scanner.nextDouble();

        Conta contaFunc = Funcs.inserir(numero, valor);
        contas.add(contaFunc);

        System.out.println("A conta: "+contaFunc.numero+"foi criada");
    }

    private static void excluir() throws RemoteException, NotBoundException {
        System.out.println("Digite o número da conta:");
        numero = scanner.nextInt();
        valor = 0;
        int contaFunc = Funcs.excluir(contas.indexOf(numero)+1);

        contas.remove(contaFunc);

        System.out.println("A conta: "+contaFunc+"foi removida");
    }

    private static void debitar() throws RemoteException, NotBoundException {
        System.out.println("Digite o número da conta:");
        numero = scanner.nextInt();
        System.out.println("Digite o valor:");
        valor = scanner.nextDouble();

        Conta contaFunc = contas.get(contas.indexOf(numero)+1);
        contaFunc = Funcs.debitar(contaFunc, valor);

        contas.add(contas.indexOf(numero)+1,contaFunc);
        System.out.println("Debitado: "+contaFunc.valor+", da conta :"+contaFunc.numero);
    }

    private static void creditar() throws RemoteException, NotBoundException {
        System.out.println("Digite o número da conta:");
        numero = scanner.nextInt();
        System.out.println("Digite o valor:");
        valor = scanner.nextDouble();

        Conta contaFunc = (Conta) contas.get(contas.indexOf(numero)+1);
        contaFunc = Funcs.creditar(contaFunc, valor);

        contas.add(contas.indexOf(numero)+1,contaFunc);
        System.out.println("Creditado: "+contaFunc.valor+", da conta :"+contaFunc.numero);
    }

    private static void consultar() throws RemoteException, NotBoundException {
        System.out.println("Digite o número da conta:");
        numero = scanner.nextInt();

        for (Conta busca: contas) {

            if (busca.numero == numero) {
                System.out.println("Numero: "+busca.numero+" Saldo: "+busca.valor);
            }
        }

    }

    public static void main(String[] args) {
        try 
        {
          // Localiza o serviço pelo nome
          Funcs = (IFuncoesBanco) Naming.lookup("rmi://192.168.1.10:3000/Banco");

          scanner = new Scanner(System.in).useLocale(Locale.US);
          int opcao;

          while (true) {
              listaMetodos();
              opcao = scanner.nextInt();
              executeMetodo(opcao);
         }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • indexOf returns the index of an object, in case you are passing an int. You have to iterate the list to find

  • 1

    Thank you all so much for your help. Now it’s working.

4 answers

7


The indexOf() takes as parameter an object and returns its index. You are passing a number as parameter, so it does not work.

To find an account by its number, you will need to scroll through the entire list using a for.

Example:

public Conta encontraConta(int numeroConta)
{
    for(Conta c : contas)
    {
        if(c.getNumero() == numeroConta)
            return c;
    }
}
  • Thank you very much for the help. The application of the function fit well in the solution of the problem.

2

indexof(Object o): Returns the index of the first occurrence of a specific element in the list, or -1 if the list does not contain the element.

Like int is different from Conta you will never find your element.

You can change the ArrayList from account to HashMap:

HashMap<Integer, Conta> contas = new HashMap<>();

Change the insertion to:

contas.put(contaFunc.getNumero(), contaFunc);

And the locations you need to retrieve the object to:

contas.get(numero);

Using these changes your class will look like:

import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Scanner;

public class ClienteStart {

  HashMap<Integer, Conta> contas = new HashMap<>();
  private static int numero;
  private static double valor;
  private static IFuncoesBanco Funcs;
  private static Scanner scanner;

  // Aqui será simulado o "menu"
  public static void listaMetodos() {
    System.out.println("/****************************************/");
    System.out.println("/* Sistema de Contas de banco */");
    System.out.println("/* Banco da Praça */");
    System.out.println("/****************************************/\n");
    System.out.println("Escolha uma opção:");
    System.out.println("1 => Inserir nova Conta");
    System.out.println("2 => Excluir Conta");
    System.out.println("3 => Debitar da Conta");
    System.out.println("4 => Creditar da Conta");
    System.out.println("5 => Consultar Conta");
    System.out.println("6 => Sair");
    System.out.println("Digite sua opção: ");
    System.out.println("/****************************************/");
  }

  // Aqui será o método a ser executado será escolhido
  // de acordo com a opção passada pelo teclado
  public static void executeMetodo(int opcao) {
    try {
      switch (opcao) {
        case 1:
          System.out.println("Função 'Inserir' escolhida.");
          inserir();
          break;
        case 2:
          System.out.println("Função 'Excluir' escolhida.");
          excluir();
          break;
        case 3:
          System.out.println("Função 'Debitar' escolhida.");
          debitar();
          break;
        case 4:
          System.out.println("Função 'Creditar' escolhida.");
          creditar();
          break;
        case 5:
          System.out.println("Função 'Consultar' escolhida.");
          consultar();
          break;
        case 6:
          System.out.println("Encerrado");
          System.exit(0);
        default:
          System.out.println("Opção inválida");
          break;
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void inserir() throws RemoteException, NotBoundException {
    System.out.println("Digite o número da conta:");
    numero = scanner.nextInt();
    System.out.println("Digite o valor:");
    valor = scanner.nextDouble();

    Conta contaFunc = Funcs.inserir(numero, valor);
    contas.put(numero, contaFunc);

    System.out.println("A conta: " + contaFunc.numero + "foi criada");
  }

  private static void excluir() throws RemoteException, NotBoundException {
    System.out.println("Digite o número da conta:");
    numero = scanner.nextInt();
    valor = 0;
    int contaFunc = Funcs.excluir(contas.get(numero));

    contas.remove(numero);

    System.out.println("A conta: " + contaFunc + "foi removida");
  }

  private static void debitar() throws RemoteException, NotBoundException {
    System.out.println("Digite o número da conta:");
    numero = scanner.nextInt();
    System.out.println("Digite o valor:");
    valor = scanner.nextDouble();

    Conta contaFunc = contas.get(numero);
    contaFunc = Funcs.debitar(contaFunc, valor);

    System.out.println("Debitado: " + contaFunc.valor + ", da conta :" + contaFunc.numero);
  }

  private static void creditar() throws RemoteException, NotBoundException {
    System.out.println("Digite o número da conta:");
    numero = scanner.nextInt();
    System.out.println("Digite o valor:");
    valor = scanner.nextDouble();

    Conta contaFunc = contas.get(numero);
    contaFunc = Funcs.creditar(contaFunc, valor);

    System.out.println("Creditado: " + contaFunc.valor + ", da conta :" + contaFunc.numero);
  }

  private static void consultar() throws RemoteException, NotBoundException {
    System.out.println("Digite o número da conta:");
    numero = scanner.nextInt();

    Conta busca = contas.get(numero)

    if (busca.numero == numero) {
      System.out.println("Numero: " + busca.numero + " Saldo: " + busca.valor);
    }
  }

  public static void main(String[] args) {
    try {
      // Localiza o serviço pelo nome
      Funcs = (IFuncoesBanco) Naming.lookup("rmi://192.168.1.10:3000/Banco");

      scanner = new Scanner(System.in).useLocale(Locale.US);
      int opcao;

      while (true) {
        listaMetodos();
        opcao = scanner.nextInt();
        executeMetodo(opcao);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

0

According to the documentation, Arraylist#indexof returns the index of a given object. As in your case is a ArrayList of Contas, you would have to pass a Conta to find something. So instead of:

(Conta) contas.get(contas.indexOf(numero)+1);

Use only Arraylist#get, which returns the object located in a given index:

contas.get(numero);

So you get an account in the user-indicated index.

Note: I saw that in your example you always do numero+1, you can do but see no use for the user. If I type 1 I probably want account number 1, not 2.

With regard to the "[.. ] declaration error [.. ]", one parent failed to close:

// Um parenteses para o if e outro para o método equals!
if(busca.numero.equals(numero))
  • I think you’re confused, numero is to be the account number (attribute value numero) and not an index.

  • @jbueno I looked at the methods credit and debit, in these cases even the variable calling itself number it uses to find the index(?). It’s a little confusing for me too

-1

Your mistake is, as others have said, that you don’t seem to have understood the indexOf. He doesn’t do what you want.

To understand how it works, here’s an example:

List<String> lista = Arrays.asList("João", "Pedro", "Maria", "Lúcia");
System.out.println(lista.indexOf("Maria")); // Escreve 2.
System.out.println(lista.indexOf("João")); // Escreve 0.
System.out.println(lista.indexOf("Miguel")); // Escreve -1, não está na lista.

Note that this means that the indexOf will not serve you, as it locates the position in which an object is from the object to be sought. This is not what you want, because what you need is to locate an object according to a key.

One way to do this would be to iterate all the positions on the list, as you do in your method consultar(). But if you need to do this kind of thing, it’s a sign that you’re taking the wrong approach, because imagine what it would be like in a real system with millions of records if it were necessary, clearly that’s not the best approach.

What you need is to locate accounts based on their number. That is, you need something that makes a mapping account number for account data. That is, you need a Map.

So, instead of a list, declare your set of accounts like this:

private static final Map<Integer, Conta> contas = new HashMap<>();

In his method of inserir(), instead:

    Conta contaFunc = Funcs.inserir(numero, valor);
    contas.add(contaFunc);

    System.out.println("A conta: "+contaFunc.numero+"foi criada");

Do it:

    if (contas.containsKey(numero)) {
        System.out.println("Essa conta já existe.");
    } else {
        Conta contaFunc = Funcs.inserir(numero, valor);
        contas.put(numero, contaFunc);
        System.out.println("A conta: " + numero + " foi criada.");
    }

In the method debitar(), instead:

    Conta contaFunc = contas.get(contas.indexOf(numero)+1);
    contaFunc = Funcs.debitar(contaFunc, valor);

    contas.add(contas.indexOf(numero)+1,contaFunc);
    System.out.println("Debitado: "+contaFunc.valor+", da conta :"+contaFunc.numero);

Do it:

    Conta contaFunc = contas.get(numero);
    if (contaFunc == null) {
        System.out.println("Essa conta não existe.");
    } else {
        contaFunc = Funcs.debitar(contaFunc, valor);
        System.out.println("Debitado " + valor + " da conta " + numero + ". O novo saldo é de " + contaFunc.valor + ".");
    }

Your method creditar() is similar to the debitar(). Note that you were confusing valor, which is the amount charged, with contaFunc.valor, which is the balance of the account.

In his method excluir(), instead:

    int contaFunc = Funcs.excluir(contas.indexOf(numero)+1);

    contas.remove(contaFunc);

    System.out.println("A conta: "+contaFunc+"foi removida");

Do it:

    Conta contaFunc = contas.get(numero);
    if (contaFunc == null) {
        System.out.println("Essa conta já não existia.");
    } else {
        contas.remove(numero);
        Funcs.excluir(contaFunc);
        System.out.println("A conta: " + numero + " foi removida.");
    }

And finally, his method consultar() do not need to go through the list. Instead:

    for (Conta busca: contas) {

        if (busca.numero == numero) {
            System.out.println("Numero: "+busca.numero+" Saldo: "+busca.valor);
        }
    }

Use this:

    Conta conta = contas.get(numero);
    if (conta == null) {
        System.out.println("Essa conta não existe.");
    } else {
        System.out.println("A conta " + numero + " tem saldo de " + busca.valor + ".");
    }
  • Can anyone explain why -1? What’s wrong here?

Browser other questions tagged

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