Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: HashSet

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123

    HashSet

    Ho in un file una matrice 6 x 6...
    la matrice l'ho letta e stampata correttamente...ora dovrei chiamare un metodo che mi verifica se ogni riga contiene valori diversi(sono valori da 1 a 6)...vorrei usare un HashSet visto che se non sbaglio non ammette duplicati...
    ho fatto nel seguente modo, ma penso non sia corretto perchè così vado a leggere tutta la matrice che gli ho passato...
    codice:
    public static void verificaRiga(int [][] matrice)
        {
            HashSet h = new HashSet();
            for(int j=0; j<matrice.length;j++)
            {
                for(int i=0; i<matrice.length; i++)
                {
                    h.add(matrice[i][j]);
                }
            }
        }

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Come hai già dedotto tu stesso in questo modo non verifichi niente sulla singola riga, ma solo sulla matrice intera.

    I due cicli for ci saranno comunque, ma devi un attimo riorganizzare e decidere come svolgere il controllo se vuoi utilizzare questa tecnica (ineccepibile, intendiamoci).

    codice:
    public static void verificariga(int[][] matrice) {
      HashSet h;
      for (int i = 0; i < matrice.length; i++) {
        h = new HashSet(); //così ne abbiamo una nuova ad ogni riga
        for (int j = 0; j < matrice[i].length; j++) {
          h.add(matrice[i][j]); // aggiungiamo gli elementi della riga i-esima
        }
        // controlliamo la dimensione di h e vediamo se sia diversa da matrice[i].length
        // implementa tu il controllo
      }
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123
    Ho aggiunto l'if al codice precedente..così può andare?
    perchè se non sbaglio HashSet se ci fossero elementi uguali non dovrebbe neanche tornare la dimensione...oppure mi sbaglio???
    codice:
    public static void verificaRiga(int [][] matrice)
        {
            HashSet h;
            for(int i=0; i<matrice.length;i++)
            {
                h = new HashSet();//cosi ne abbiamo una nuova ad ogni riga
                for(int j=0; j<matrice[i].length; j++)
                {
                    h.add(matrice[i][j]);
                }
                if(h.size()==matrice[i].length)
                {
                    System.out.println("OK!!ogni riga contiene numeri diversi");
                }
            }
        }

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    il metodo .size() di HashSet ritorna comunque la dimensione del tuo Set... La cosa importante è che un Set, ovvero un insieme, non ammette, per definizione, elementi duplicati... ovvero provare a fare un .add passando come argomento un elemento già presente non comporta alcun errore, ma è un'azione che viene semplicemente ignorata e quindi non andando ad incidere nel computo della dimensione del Set.

    PS: lavora con la documentazione sotto mano, tante domande trovano risposta nelle API.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123
    capito andrea...
    cercherò di utilizzare di più la documentazione...
    comunque il mio codice, così come l'ho fatto io, va bene vero? oppure si poteva fare in un altro modo(però sempre utilizzando HashSet, perchè al momento mi interessa vedere un pò questo)?

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    La documentazione per un programmatore è come il vangelo per un prete: è assolutamente indispensabile usarla (e saperla usare). Una volta che avrai preso sufficiente confidenza vedrai che in pochi secondi riuscirai a trovare le risposte a gran parte dei tuoi dubbi.

    Il codice che hai scritto tu va bene e, volendo usare la classe HashSet, è la soluzione più naturale al tuo problema. Ti segnalo solo che il messaggio corretto dentro l'if dovrebbe essere:

    codice:
    System.out.println("OK!! La riga " + i + " contiene numeri diversi");
    Non te lo dico per il messaggio in sè (che in realtà non è molto importante), ma solo perchè ti sia chiaro cosa stai facendo. Anzi, potrebbe anche essere utile impiegare un "else", in questo modo:

    codice:
    else
    {
      System.out.println("Errore!! La riga " + i + " contiene almeno due numeri uguali");
    }

  7. #7
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    io lo farei così
    codice:
    public static void verificaRiga(int [][] matrice)
        {
            boolean diversi=true;
            HashSet h;
            for(int i=0; i<matrice.length && diversi;i++)
            {
                h = new HashSet();//cosi ne abbiamo una nuova ad ogni riga
                for(int j=0; j<matrice[i].length && diversi; j++)
                {
                    diversi=h.add(matrice[i][j]);
                }
            }
            if(diversi)
            {
                   System.out.println("OK!!ogni riga contiene numeri diversi");
            }
            else
            {
                   System.out.println("Mi spiace alla riga "+ i +" ci sono almeno due numeri uguali");
            }
        }

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    In questo modo l'analisi della matrice viene interrotta non appena viene identificato il primo numero doppio.
    Solo un dettaglio:

    codice:
    System.out.println("Mi spiace alla riga " + (i - 1) + " ci sono almeno due numeri uguali");
    Prima di stamparlo, l'indice "i" deve essere decrementato di 1.

  9. #9
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    se si vuole l'indice da 0 a n-1 si deve decrementare se si vuole l'indice da 1 a n no, dipende uno come vuole fare

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    123
    La documentazione per un programmatore è come il vangelo per un prete: è assolutamente indispensabile usarla (e saperla usare). Una volta che avrai preso sufficiente confidenza vedrai che in pochi secondi riuscirai a trovare le risposte a gran parte dei tuoi dubbi.
    Lo so desa, ma il mio problema è che a volte faccio fatica a comprendere alcuni passaggi della lingua inglese che il traduttore ovviamente mi traduce in maniera inopportuna.
    A parte questo, hai qualche consiglio sul "come saperla usare"?

    Altra cosa...l'esempio di prima l'ho capito benissimo...ma, se ora dovessi verificare che non ci siano numeri uguali nelle 4 matrici 3x3 che si vengono a formare suddividendo la matrice 6x6 in 4 parti? dovrei dare esplicitamente l'indice in cui deve terminare ogni riga e colonna?

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