Esercizio con Array e classi

di il
7 risposte

Esercizio con Array e classi

Ciao ragazzi , sto svolgendo un'esercizio in cui dato un 'array bidimensionale , che rappresenta una matrice di Interi , deve avere questi 2 metodi:

1)Ritorna un boolean,  true nel caso in cui , dato un'indice di riga della matrice , gli elementi della riga sono o tutti uguali o tutti diversi , altrimenti ritorna false;

Questo metodo funziona e lo ho fatto nel seguente modo:

public boolean tuttiUgualiODiversi(int i){
        boolean n=true;
        //Tutti uguali
        for(int k=0;k<mat.length;k++){
        for(int j=k+1;j<mat.length;j++){
            if(mat[i][k]!=mat[i][j]){
                n=false;
            }
        }
    }
//Tutti diversi
    if(n==false){
n=true;
        for(int k=0;k<mat.length;k++){
            for(int j=k+1;j<mat.length;j++){
                if(mat[i][k]==mat[i][j]){
                    n=false;
                }
            }
        }
    }
        return n;
    }

    2)Il secondo metodo mi funziona solo in parte : in pratica deve  ritornare un'array bidimensionale “ridotto” , ovvero deve contenere solo le righe che soddisfano il metodo 1).Quindi in questo caso tutto l'array.

Ecco come lo ho fatto:

  public MatriceDiInt riduci() {
        int count = 0;
        for (int i = 0; i < mat.length; i++) {
            if (tuttiUgualiODiversi(i) == true) {
                count++;
            }
        }
        int[][] nuova = new int[count][mat.length];
        int indice = 0;
        for (int k = 0; k < mat.length; k++) {
            if (tuttiUgualiODiversi(k) == true) {
                for (int j = 0; j < mat.length; j++) {
                    nuova[indice][j] = mat[k][j];
                }
                indice++;
            }


        }
        MatriceDiInt q = new MatriceDiInt(nuova);
        return q;


    }

    Il metodo di per sè funziona , solo che quando lo vado a stampare , mi stampa solo i primi 2 numeri per ogni riga :Se ad esempio l'array contiene 5 elementi per riga , e le righe che soddisfano il metodo 1) sono 2 , mi stamperà le due righe ma solo con le prime 2 colonne , e non tutte . 

Spero di essere stato chiaro abbastanza , grazie in anticipo!

7 Risposte

  • Re: Esercizio con Array e classi

    Per la precisione , quando crea l'array “nuova” che dovrebbe contenere  le righe che rispettano la condizione , mi crea un'array con lo stesso numero di righe (dato da count) e lo stesso numero di colonne (che dovrebbe essere però mat.length).Esempio:

    Ho un'array quadrato;

    1       1        1

    1        2        3

    1        1        2

    Quindi rispettano la condizione la riga 1(sono tutti uguali) e la 2(sono tutti diversi) , la 3 no.

    Quindi mi dovrebbe stampare solo:

    1   1    1

    1    2    3

    Invece a me stampa solo i primi 2 caratteri della soluzione , cioè :

    1    1

    1    2

    In pratica vanno in base a quante righe rispettano la condizione , spero di essere stato più chiaro!

  • Re: Esercizio con Array e classi

    Non ho letto tutto il codice, ma ad una prima occhiata si vede subito che c'è qualcosa che non va: se hai un indice di riga e devi controllare quella riga, devi usare un solo for, non 2 uno annidato nell'altro.

    Quindi non capisco perchè tu stia usando due for (uno con k e uno con j) se devi scorrere solo una riga. Poi magari funziona lo stesso (ho i miei dubbi), ma probabilmente fa un sacco di operazioni completamente inutili.

    Concettualmente, per verificare che tutti gli elementi della riga i-esima siano uguali, si dovrebbe procedere così:

    1) scorro la riga a partire dal secondo elemento fino alla fine (indice K)

    2) Ad ogni iterazione controllo se l'elemendo k-esimo della riga è uguale al primo elemento.

    3) Se sono uguali procedo, altrimenti imposto “n” (pessima scelta del nome della variabile) a false e mi fermo già.

    Un solo ciclo che scorre la riga (non due, uno dentro l'altro).

  • Re: Esercizio con Array e classi

    Chiedo Scusa per il nome delle variabili , cerco di spiegarti:

    Il primo ciclo(con k) mi ferma il numero di posto k , e il ciclo  con j il numero seguente(k+1). A questo punto , il ciclo verifica che gli elementi dal posto j(che inzia da k+1) , siano tutti diversi da k. Una volta però che ho controllato il primo intero , devo ripetere la procedura per tutti gli int dell'array , devo verificare che TUTTI gli elementi del ciclo siano diversi o  uguali tra loro .

    In pratica entrambi i for mi servono per scorrere la riga. 

    Il problema comunque non è del primo metodo , ma del secondo , il primo metodo funziona in quanto lo ho testato , è il secondo che mi crea un'array “sballato”(Ho spiegato il problema nel secondo commento).

    Spero di essere stato più chiaro!!

  • Re: Esercizio con Array e classi

    Lascia perdere al momento la parte che riguarda la verifica che tutti i numeri siano diversi e concentrati sulla parte in cui tutti devono essere uguali.

    Il doppio for non serve a nulla (anzi, è proprio deleterio).

    Rileggi la mia precedente risposta e pensaci.

    Il problema della stampa è dovuto sicuramente alla routine che stampa i valori a video, che qui non è riportata (dato che la matrice ha MENO righe rispetto alle colonne: è una matrice rettangolare! Devi usare un indice specifico per scorrere le colonne basato sulla lunghezza della riga, ovvero il numero di colonne e non sulla lunghezza della matrice, che è il numero di righe). Il codice del secondo punto è corretto, l'ho verificato.

    Quando si deve stampare una matrice generica (che può essere rettangolare) si deve agire in questo modo:

    for(int i=0; i<mat.length; i++) {
       for(int j=0; j<mat[i].length; j++) {
          System.out.print(nuova[i][j] + " ");
       }
       System.out.println();
    }
  • Re: Esercizio con Array e classi

    Per quanto riguarda il fatto dei numeri tutti uguali ora ho capito , e in effetti basta un solo for, mentre non capisco come risolvere il secondo problema : ti mostro le classi che ho fatto.

    Classe Con i Metodi:

    public class MatriceDiInt {
        private int[][] mat;
    
    //Costruttore
        public MatriceDiInt(int[][] m) {
            this.mat = m;
        }
    
    //Metodo che viene usato per stampare la matrice
        public String toString() {
            String s = "";
            for (int i = 0; i < mat.length; i++) {
                for (int j = 0; j < mat.length; j++) {
                    s += mat[i][j] + "\t";
                }
                s += "\n";
            }
    
    
            return s;
        }
    
    //Metodo1
        public boolean tuttiUgualiODiversi(int i) {
            boolean n = true;
            // Tutti uguali
           
                for (int j = 1; j < mat.length; j++) {
                    if (mat[i][0] != mat[i][j]) {
                        n = false;
                   
                }
            }
            // Tutti diversi
            if (n == false) {
                n = true;
                for (int k = 0; k < mat.length; k++) {
                    for (int j = k + 1; j < mat.length; j++) {
                        if (mat[i][k] == mat[i][j]) {
                            n = false;
                        }
                    }
                }
    
    
            }
    
    
            return n;
        }
    
    //Metodo 2
        public MatriceDiInt riduci() {
            int count = 0;
            for (int i = 0; i < mat.length; i++) {
                if (tuttiUgualiODiversi(i) == true) {
                    count++;
                }
            }
            int[][] nuova = new int[count][mat.length];
            int indice = 0;
            for (int k = 0; k < mat.length; k++) {
                if (tuttiUgualiODiversi(k) == true) {
                    for (int j = 0; j < mat.length; j++) {
                        nuova[indice][j] = mat[k][j];
                    }
                    indice++;
                }
    
    
            }
            MatriceDiInt q = new MatriceDiInt(nuova);
            return q;
    
    
        }
    
    
    }

    Classe di Prova:

    public class ProvaMatriceDiInt {
        public static void main(String[] args) {
            InputWindow in = new InputWindow();
            int dim = in.readInt("Quante righe e colonne vuoi inserire?");
            int[][] matrice = new int[dim][dim];
    
    
            for (int i = 0; i < dim; i++) {
                for (int j = 0; j < dim; j++) {
                    matrice[i][j] = in.readInt("Inserisci Elemento riga: " + i + " e colonna: " + j);
                }
            }
            MatriceDiInt m = new MatriceDiInt(matrice);
    
    
            OutputWindow out = new OutputWindow();
            out.write(m.toString());
    
    
            int indice = in.readInt("Inserisci indice riga da controllare");
    
    
            boolean uguali = m.tuttiUgualiODiversi(indice);
            out.write("Elementi di riga: " + indice + " ha elementi tutti uguali o tutti diversi: " + uguali + "\n");
    
    
            out.write("Array con righe di soli numeri diversi o uguali: " + "\n");
            out.write(m.riduci().toString());
    
    
        }
        
        
    
    }

    Spero che ce la fai a capire cosa è che non va.

  • Re: Esercizio con Array e classi

    Guarda la differenza tra il tuo metodo toString() della classe MatriceDiInt e la routine di stampa che ho messo alla fine del mio ultimo post. In particolare, controlla la guardia del for interno. :)

  • Re: Esercizio con Array e classi

    Ti ringrazio SpiritoLibero, ora funziona! Effettivamente per come lo avevo fatto io funzionava solo per matrici quadrate , ovvero con lo stesso numero di righe e colonne , Grazie Mille !!!

Devi accedere o registrarti per scrivere nel forum
7 risposte