Ordinamento Oggetti

di il
3 risposte

Ordinamento Oggetti

Ciao a tutti, questo è il mio secondo topic e forse sto iniziando a seccare alcune persone.
Il titolo è molto semplice, ovvero l'ordinamento, ma questa volta volevo che era un programma già pronto ad ordinare i miei valori e quindi ho utilizzato il famoso Arrays.sort(T[], comparator<? super T (credo)>).
Il fatto sta è che non ordina!!
Non so se conviene mettere tutto il codice ma metterò le cose essenziali:

package classi;


public class ContoCorrente {

private final String nome;
private int id;
private static int proxId = 0;
private int saldo;

// COSTRUTTORI
public ContoCorrente(String nome, int saldo) {
this.nome = nome;
this.id = id + proxId++;
this.saldo = saldo;
}

public ContoCorrente(String nome) {
this.nome = nome;
this.id = id + proxId++;
this.saldo = 0;
}

// METODI SETTER AND GETTER

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public static int getProxId() {
return proxId;
}

public static void setProxId(int proxId) {
ContoCorrente.proxId = proxId;
}

public int getSaldo() {
return saldo;
}

public void setSaldo(int saldo) {
this.saldo = saldo;
}

public String getNome() {
return nome;
}

@Override
public String toString() {
return this.getClass()+ "[nome=" + nome + ", id=" + id + ", saldo=" + saldo + "]";
}



// METODI DELLA CLASSE

public boolean deposito(int saldoDaDepositare) {
boolean esito = false;
if (saldoDaDepositare > 0) {
saldo = saldo + saldoDaDepositare;
esito = true;
}

return esito;
}

public boolean prelievo(int saldoPrelievo) {
boolean esito = false;
if (saldo - saldoPrelievo >= 0 && saldoPrelievo > 0) {
saldo = saldo - saldoPrelievo;
esito = true;
}

return esito;
}

}


package classi;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Banca {

// COSTRUTTORE + GETTER AND SETTER
private String name;
List<ContoCorrente> clienti;

public Banca(String name) {
this.name = name;
clienti = new ArrayList<ContoCorrente>();
}

public String getName() {
return name;
}

public List<ContoCorrente> getClienti() {
return clienti;
}

// METODI DI CLASSE

public boolean depositoPerCliente(int id, int saldo) {
ContoCorrente clienteTrovato = prendoCiente(id);
boolean esito = false;

if (clienteTrovato != null & saldo > 0) {
clienteTrovato.deposito(saldo);
esito = true;
}

return esito;
}

public boolean prelievoPerCliente(int id, int saldo) {
ContoCorrente clienteTrovato = prendoCiente(id);
boolean esito = false;

if (clienteTrovato != null & saldo > 0 & clienteTrovato.getSaldo() - saldo >= 0) {
clienteTrovato.prelievo(saldo);
esito = true;
}

return esito;
}

public boolean nuovoContoCorrente(ContoCorrente nuovoCliente) {
boolean esito = true;

for (ContoCorrente cl : clienti) {
if (cl.getNome() == nuovoCliente.getNome()) {
esito = false;
break;
}
}

if (esito)
clienti.add(nuovoCliente);
return esito;
}

public int saldoBanca() {
int sum = 0;
for (ContoCorrente cliente : clienti)
sum = sum + cliente.getSaldo();

return sum;
}

public void ordinamentoNome() {
Arrays.sort(clienti.toArray(new ContoCorrente[0]),(cliente1,cliente2)->{
return cliente1.getNome().compareTo(cliente2.getNome());
});
}

// METODI PRIVATI

private ContoCorrente prendoCiente(int id) {
ContoCorrente cliente = null;

for (ContoCorrente i : clienti) {
if (i.getId() == id)
cliente = i;
}

return cliente;

}

}

Ora sicuramente avete notato l'errore che ho fatto, ma il metodo ordinamentoNome() non ordina l'array.
Io ringrazio tutti e spero che quando diventerò abbastanza bravo posso ricambiare.
Grazie ancora!

3 Risposte

  • Re: Ordinamento Oggetti

    Bait ha scritto:


    Il fatto sta è che non ordina!!
    Ora sicuramente avete notato l'errore che ho fatto, ma il metodo ordinamentoNome() non ordina l'array.
    La comparazione del nome nel sort è corretta. Quello che ti è sfuggito è che hai fatto:

    Arrays.sort(clienti.toArray(new ContoCorrente[0]), .....

    Questo crea un NUOVO array che contiene gli stessi oggetti ContoCorrente della lista clienti. L'ordinamento viene fatto su questo nuovo array che però passi "al volo" al sort e poi NON usi/assegni da alcuna parte. Questo è il problema ... non "vedi" alcun risultato.

    Quindi: quale era il motivo della creazione di un nuovo array?
  • Re: Ordinamento Oggetti

    Puoi fare semplicemente
    
    import java.util.*;
    
    [...]
    
    public void ordinamentoNome() {
        Comparator<ContoCorrente> c = (ContoCorrente c1, ContoCorrente c2) -> c1.getNome().compareTo(c2.getNome());
        Collections.sort(clienti, c);
    }
    
    [...]
    
        public static void main(String args[]) {
          Banca B = new Banca("ABC");
          B.nuovoContoCorrente(new ContoCorrente("Gianni", 1000));
          B.nuovoContoCorrente(new ContoCorrente("Paolo", 100));
          B.nuovoContoCorrente(new ContoCorrente("Giovanni", 3000));
          B.getClienti().forEach(c -> System.out.println(c.getNome() + " " +  c.getSaldo()));
          B.ordinamentoNome();
          B.getClienti().forEach(c -> System.out.println(c.getNome() + " " +  c.getSaldo()));   
        }
    
    
  • Re: Ordinamento Oggetti

    F30 grazieee, purtroppo quando faccio dei piccoli errori e con il debuggin non riesco a vederlo se utilizzo ArraysSort.
    Allora il piano era ordinare la lista dei clienti usando una lambda. Ovviamente il codice verrà migliorato man mano.
    So che per le collezioni devo utilizzare le Stream, ma ancora devo studiarle per bene.
    Grazie molto gentile, comunque se mi vuoi dare anche dei consigli mi fai un piacere

    Adesso ho cambiato il codice
    /*
    * public boolean nuovoContoCorrente(ContoCorrente nuovoCliente) {
    boolean esito = true;
    *
    * for (ContoCorrente cl : clienti) {
    if (cl.getNome() ==nuovoCliente.getNome()) {
    esito = false;
    break; } }
    *
    * if (esito) clienti.add(nuovoCliente); return esito;
    }
    */

    Con:
    public boolean nuovoContoCorrente(ContoCorrente nuovoCliente) {
    boolean esito = false;
    boolean siTrovaDentro = clienti.contains(nuovoCliente);
    if (!siTrovaDentro) {
    clienti.add(nuovoCliente);
    esito = true;
    }

    return esito;
    }

    Credo che sia più leggibile
Devi accedere o registrarti per scrivere nel forum
3 risposte