Index returning -1 in Java ArrayList

Good Morning. For study purposes, I am making a simple application in RMI Java that simulates some operations(Create Account, Check Balance, debit etc..) on one, or more, beads. For each account created I generate an object of type Conta containing its respective number and balance and store it 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 and etc...). I'm using the contas.indexOf(numero) Method to return the index of the array contas to me, but it always returns the index -1 to me.

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 reported by parameter. I did some research and tried the form for (Conta busca : contas) but it didn't work either, even me using a if (busca.numero == numero). When I use this if, it always gives true, as if the number of all accounts is the even. And when I use if(busca.numero.equals(numero) netbeans presents an error in the declaration.

Could anyone 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();
        }
    }
}
Author: Victor Stafusa, 2016-11-22

4 answers

O indexOf() it takes as parameter An Object and returns its index. You're passing a number as a parameter, so it doesn't 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;
    }
}
 7
Author: LINQ, 2016-11-22 12:17:16

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.

As int is different from Conta will never find its element.

You can change the ArrayList Account to HashMap:

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

Change insert to:

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

And the locations you need to retrieve the object for:

contas.get(numero);

Using these changes your class will look like com:

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();
    }
  }
}
 2
Author: Sorack, 2016-11-22 13:28:32

According to the documentation, ArrayList#indexOf returns the index of a given object. As in your case it is a ArrayList of Conta s, 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 at a given index:

contas.get(numero);

Thus you get an account in the index indicated by the user.

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

With respect to" [..] declaration error [..] ", missed closing a parentheses:

// Um parenteses para o if e outro para o método equals!
if(busca.numero.equals(numero))
 0
Author: Genos, 2016-11-22 11:58:51

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

To understand how it works, here is 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 indexOf will not serve you, as it locates the position in which an object is from the object to be searched. This is not what you want, as what you need is to locate an object according to a key.

One way to do this would be to iterate all positions in the list, just as you do in your consultar() Method. But if you are needing to do this kind of thing, it is a sign that you are taking the wrong approach, as imagine what it would be like in a real system with millions of records if this were needed, Clearly this is not the best approach.

What you need is to locate accounts based on their number. That is, you need something that does a mapping of the account number to the data of the account itself account. 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 your method of inserir(), instead:

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

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

Do this:

    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 debitar() method, 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 this:

    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 debitar(). Note that you were confusing valor, which is the amount debited, with contaFunc.valor, which is the account balance.

In your method excluir(), instead:

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

    contas.remove(contaFunc);

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

Do this:

    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, your method consultar() does not need to scroll 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 + ".");
    }
 -1
Author: Victor Stafusa, 2016-11-22 12:47:51