Index returning -1 in Java ArrayList

3

Good morning. For study purposes, I am making a simple application in RMI Java that simulates some operations (create account, check balance, debit etc ...) in one, or more, accounts. For each account created I generate an object of type Conta containing its respective number and balance and store it in ArrayList . The problem occurs when I need to retrieve a specific object in the array (using the account number as parameter) to perform some operation (debit, credit, remove and etc ...). I'm using the contas.indexOf(numero) method to return the array index contas , but it always returns 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 reported per parameter. I did some research and tried the for (Conta busca : contas) form but it also did not work even though I was using if (busca.numero == numero) . When I use this if, it always gives true, as if the number of all accounts was the same. And when I use if(busca.numero.equals(numero) netbeans has 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();
        }
    }
}
    
asked by anonymous 22.11.2016 / 12:38

4 answers

7

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

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

Example:

public Conta encontraConta(int numeroConta)
{
    for(Conta c : contas)
    {
        if(c.getNumero() == numeroConta)
            return c;
    }
}
    
22.11.2016 / 12:55
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.

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

You can change the ArrayList of account to HashMap :

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

Change the insertion to:

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

And the places you need to retrieve the object for:

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();
    }
  }
}
    
22.11.2016 / 13:12
0

According to the documentation, ArrayList # indexOf returns the index of a given object. Since in your case it is a% w of% of ArrayList s, you would have to pass 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);

So you get an account at the index indicated by the user.

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

Regarding the "[..] error of declaration [..]", he failed to close a parenthesis:

// Um parenteses para o if e outro para o método equals!
if(busca.numero.equals(numero))
    
22.11.2016 / 12:58
-1

Your mistake is, as others have said, that you seem to have misunderstood indexOf . It does not 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, because it locates the position where an object is from the object to be searched for. This is not what you want because what you need is to find an object according to a key.

One way to do this would be to iterate through all the positions in the list, just like you do in your consultar() method. 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 that were needed, clearly that's not the best approach.

What you need is to locate accounts based on their number. That is, you need something that map the account number for your 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 your inserir() method, 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 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 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 creditar() method is similar to debitar() . Note that you were confusing valor , which is the amount debited, with contaFunc.valor , which is the balance of the account.

In your excluir() method, 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 consultar() method does not have 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 + ".");
    }
    
22.11.2016 / 13:47