Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JAVA] Problema nell'inserimento di Stringhe in una LinkedList

    Salve, mi chiamo Deborah.
    Sono alle prese con un programma di programmazione oggetti che gestisce la prenotazione di proposte di viaggio. Nella classe principale ho il metodo addDestination(String destinationName, String...operatorName) che lancia un eccezione se la destinazione è già presente nell'HashMap dell'elenco delle destinazioni altrimenti definisce una destinazione e le associa gli operatori che la trattano. Inoltre questo metodo definisce gli operatori dati i loro nomi, se non sono già stati definiti in precedenza.
    Sempre nella classe principale ho anche il metodo getDestinations(String operatorName) che restituisce la lista ordinata dei nomi delle destinazioni trattate dall'operatore passato.

    Nella classe Operator ho creato i metodi get e set per la LinkedList <String> delle destinazioni dell'operatore.

    codice:
    public void setDestinazione(String q){
      elencoDestinazioni.add(q);
     }
     public LinkedList<String> getDestinazioni(){
      return elencoDestinazioni;
     }
    Nella classe principale invece ho i seguenti due metodi:

    codice:
    public void addDestination(String destinationName, String... operatorNames) throws TravelException {
      Destination d = elencoDestinazioni.get(destinationName);
      if(d != null) throw new TravelException();
      Destination d2 = new Destination(destinationName);
      elencoDestinazioni.put(destinationName, d2);
      for(String ss : operatorNames){
       Operator o = new Operator(ss);
       elencoOperatori.put(ss, o);
       o.setDestinazione(destinationName);
       d2.setOperatore(ss);
      }
     }
    
    public List<String> getDestinations(String operatorName) {
      return elencoOperatori.get(operatorName).getDestinazioni();
     }
    Nel metodo addDestination ho considerato il fatto che per le HashMap se inserisco un oggetto con indice già presente lo sovrascrive, quindi dovrebbe andare bene nel mio caso. Il problema sta nel fatto che il metodo getDestinations mi restituisce sempre e solo l'ultimo oggetto della LinkedList della classe Operator e non tutta la lista..

    Ho provato anche ad utilizzare il seguente metodo ma in questo caso non restituisce proprio niente.

    codice:
    public void addDestination(String destinationName, String... operatorNames) throws TravelException {
      Destination d = elencoDestinazioni.get(destinationName);
      if(d != null) throw new TravelException();
      Destination d2 = new Destination(destinationName);
      elencoDestinazioni.put(destinationName, d2);
      for(String s : operatorNames){
       Operator o = elencoOperatori.get(s);
       if(o == null){
        elencoOperatori.put(s, new Operator(s));
       }
       Operator o2 = new Operator(s);
       o2.setDestinazione(destinationName);
       d2.setOperatore(s);
      }
     }

    Confido nel vostro aiuto perché è da ieri che sono qui ferma e in mio cervello inizia a chiedere pietà

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Puoi spiegare (o mostrare) meglio come sono fatte le classi?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Questa è la classe principale:
    codice:
    public class TravelHandling {
     private int numClienti;
     private HashMap<String, Customer> elencoClienti;
     private HashMap<String, Destination> elencoDestinazioni;
     private HashMap<String, Operator> elencoOperatori;
     
    
     public TravelHandling(){
      elencoClienti = new HashMap<>();
      elencoDestinazioni = new HashMap<>();
      elencoOperatori = new HashMap<>();
      elencoProposte = new HashMap<>();
      elencoQuotes = new LinkedList<>();
      numClienti = 0;
     }
    
    
     public void addCustomers(String... userNames) {
      for(String s : userNames){
       Customer c = new Customer(s);
       elencoClienti.put(s, c);
       numClienti = numClienti +1;
      }
     }
    
    
    
     public void addDestination(String destinationName, String... operatorNames) throws TravelException {
      Destination d = elencoDestinazioni.get(destinationName);
      if(d != null) throw new TravelException();
      Destination d2 = new Destination(destinationName);
      elencoDestinazioni.put(destinationName, d2);
      for(String ss : operatorNames){
       Operator o = new Operator(ss);
       elencoOperatori.put(ss, o);
       o.setDestinazione(destinationName);
       d2.setOperatore(ss);
      }
     }
    
    
    
    public List<String> getDestinations(String operatorName) {
      return elencoOperatori.get(operatorName).getDestinazioni();
    }
    }
    Questa la classe Operator:

    codice:
    public class Operator {
     private String nomeOperatore;
     private LinkedList<String> elencoDestinazioni;
     private String proposta;
     private TravelHandling appartenenza;
     public Operator(String n){
      nomeOperatore = n;
      elencoDestinazioni = new LinkedList<>();
     }
     public void setDestinazione(String q){
      elencoDestinazioni.add(q);
     }
     public LinkedList<String> getDestinazioni(){
      return elencoDestinazioni;
     }
     public String getNome(){
      return nomeOperatore;
     }
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Da quello che vedo mi pare normale che ti restituisca sempre un unico risultato come destinazione, non dovresti creare un nuovo Operatore ogni volta, altrimenti ovviamente lo sovrascrive all'interno della mappa, ma a quello che dici non mi pare che vada bene nel tuo caso ...

    Il secondo metodo addDestination che hai postato è più vicino a quella che mi sembra essere la soluzione, c'è solo un piccolo particolare :

    codice:
    for(String s : operatorNames) {
    	Operator o = elencoOperatori.get(s);
    	if(o == null) {
    		elencoOperatori.put(s, new Operator(s));
    	}
    	Operator o2 = new Operator(s);
    	o2.setDestinazione(destinationName);
    	d2.setOperatore(s);
    }
    Qui giustamente controlli per ogni nome se è già presente un operatore con quel dato nome, ma dopo il primo if (o == null) dovresti mettere un ramo else (altrimenti effettui un doppio inserimento), e soprattutto quell'operator o2 non viene aggiunto in nessun modo alla mappa. Io farei :

    codice:
    for (String s : operatorNames) {
    	Operator o = elencoOperatori.get (s);
    	if (o == null) elencoOperatori.put (s, new Operator (s));
    	else o.setDestinazione(destinationName);
    	d2.setOperatore(s);
    }
    Nel senso che se o non è null, non hai bisogno di creare un nuovo operatore, devi solo aggiungere la destinazione a quello già trovato!

    Con questa modifica dovrebbe funzionare ...

    A livello di design gli altri sapranno sicuramente dirti di più di me, da quel che vedo io ti consiglierei solo di usare i nomi dei metodi secondo le convenzioni: nel senso che chi legge setDestinazione si aspetta che tu, per quell'oggetto Operatore, vada in effetti a sovrascrivere una variabile destinazione (questo è il classico uso di un metodo set, al limite con un controllo che ti impedisca di impostare una certa destinazione a fronte di determinate esigenze).

    Se invece tu vuoi aggiungere una nuova destinazione, chiama il metodo in modo diverso, addDestinazione sarebbe il nome più ovvio, non preoccuparti se esistono metodi con nomi simili, crei molta più confusione così.

    E poi quel metodo e setOperatore passano in realtà delle stringhe, non gli oggetti corrispondenti, perché hai scelto questo approccio?
    Potrebbe essere utile a una certa destinazione o a un certo operatore poter accedere ad altri campi che non siano il nome ...
    Se il problema è che vuoi utilizzare il campo String come valore di chiave della mappa, e non ridefinire equals e hashcode per le classi da usare come chiave, magari dovresti cambiare il design delle classi (anche se ridefinire quei metodi può essere fatto automaticamente)...

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.