Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    4

    Come confronatre due ArrayList con numero di Elementi differenti

    Buongiorno a tutti,

    vorrei chiedere una spiegazione che potrebbe sembrare una banalità, ma se qualcuno mi spiegasse l'errore che commetto col codice potrei vederci più chiaro.
    La situazione è questa: ho due ArrayList di stringhe, una contiene tutte le skills dei lavoratori in cerca di un lavoro, mentre la seconda arraylist contiene tutte le skills necessarie per le varie offerte di lavoro. A loro volta, entrambe sono contenute rispettivamente nell'arrayList lavoratori e nell'ArrayList offerte (in modo che capiate bene il codice che posterò). Voglio che, date le offerte di lavoro, per cui sono richieste determinate skills, il codice mi restituisca il numero di lavoratori che posseggono quelle skills. Per quetso voglio costruire una mappa che abbia come chiave il titolo dell'offerta di lavoro e come valore il numero di lavoratori idonei(che posseggono gli skills richiesti).


    Ecco il mio codice:

    codice:
    public HashMap<String, Integer> lavoratoriGiusti(){
           
            int count=0;
           HashMap<String,Integer> offerteLavoratori=new HashMap<>();
            for(int j=0;j<lavoratori.size();j++){
           for(int i=0; i<offerte.size();i++){
             
            if((lavoratori.get(j).getSkills()).containsAll(offerte.get(i).getSkillIndispensabili())){
                        count++;
                        offerteLavoratori.put(offerte.get(i).getTitoloAnnuncio(), count);  
                    }
                    else{
                        System.out.println("non ci sono lavoratori adeguati");
                    }
                    
                }
              
            }
            return offerteLavoratori;
        }

    Non mi da errore, ma ciò che vedo facendo il debug, è che non entra affatto dentro lif, questo perchè è come se vedesse solo il primo elemento delle rispettive arraylist, senza scorrerlo, e ovviamente alla prima posizione non ci sono lavoratori con skills richieste nella prima offerta.
    Potete aiutarmi a capire dove sbaglio?


    Grazie in anticipo.
    Ultima modifica di LeleFT; 09-02-2017 a 14:22 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Siadd Visualizza il messaggio
    codice:
            if((lavoratori.get(j).getSkills()).containsAll(offerte.get(i).getSkillIndispensabili())){
    Se getSkills() dà un (Array)List<String> e getSkillIndispensabili() dà un (Array)List<String>, il senso e approccio è quello corretto.

    Chiaramente le stringhe dovranno essere nella stessa forma. Se nella prima lista c'è un "Programmatore", nella seconda ci deve essere "Programmatore" ... non "programmatore", altrimenti non ti corrisponde un bel niente.

    Quote Originariamente inviata da Siadd Visualizza il messaggio
    codice:
                        count++;
                        offerteLavoratori.put(offerte.get(i).getTitoloAnnuncio(), count);
    Questo invece è sbagliato. A te serve un "conteggio" per ciascun titolo (di annuncio) mentre ora stai usando un contatore unico.
    Devi ragionare diversamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2017
    Messaggi
    4
    Grazie, ho capito dove sbagliavo per il contatore: ora il codice mi sembra corretto.

    public HashMap<String, Integer> lavoratoriGiusti(){

    int [] count=new int[offerte.size()];
    HashMap<String,Integer> offerteLavoratori=new HashMap<>();
    for(int j=0;j<lavoratori.size();j++){
    for(int i=0; i<offerte.size();i++){

    if((lavoratori.get(j).getSkills()).containsAll(off erte.get(i).getSkillIndispensabili())){
    count[i]++;
    offerteLavoratori.put(offerte.get(i).getTitoloAnnu ncio(), count[i]);
    }
    else{
    offerteLavoratori.put(offerte.get(i).getTitoloAnnu ncio(), count[i]);
    }
    }

    }
    return offerteLavoratori;
    }


    Resta il fatto che, quando faccio il debug, non mi entra dentro l'if, e non è un problema di maiuscole, ecc., perchè sono argomenti scritti proprio nello stesso modo. Mi vede il primo elemento, vede che non ci sono corrispondenze ed esce...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Siadd Visualizza il messaggio
    Grazie, ho capito dove sbagliavo per il contatore: ora il codice mi sembra corretto.
    Molto contorto ..... quando dicevo "ragionare diversamente" intendevo proprio ragionare (meglio) in maniera differente.

    Visto che il conteggio è del numero di lavoratori "appropriati" PER (ciascuna) OFFERTA, allora pensa: potresti migliorare l'algoritmo se il ciclo più esterno fosse quello delle offerte??

    Quote Originariamente inviata da Siadd Visualizza il messaggio
    Resta il fatto che, quando faccio il debug, non mi entra dentro l'if, e non è un problema di maiuscole, ecc., perchè sono argomenti scritti proprio nello stesso modo. Mi vede il primo elemento, vede che non ci sono corrispondenze ed esce...
    Verifica bene (in debugging) cosa danno getSkills() e getSkillIndispensabili(). Cioè osservando cosa danno, valuta se ti aspetti che entri o no nel if.

    Nota che il concetto del containsAll è quello giusto, es.:

    codice:
    List<String> skills = Arrays.asList("C++", "Java", "C#");
    
    List<String> skillsReq1 = Arrays.asList("C++", "C#");
    List<String> skillsReq2 = Arrays.asList("C++", "C#", "Perl");
    
    System.out.println(skills.containsAll(skillsReq1));     // true
    System.out.println(skills.containsAll(skillsReq2));     // false
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.