Confronto righe di matrici

di il
11 risposte

Confronto righe di matrici

Buonasera!

Avrei bisogno di una manco con questo programmino:
public class prova{
	
	
	public static boolean righe(int[]a,int[]b){
		for(int i=0;i<a.length;i++){
			if(a[i]!=b[i])
				return false;
		}
		return true;
	}
	
	public static void main(String[] args){
		
		int[][]m={{1,3,3,4},{4,5,6,8},{7,8,9,3},{8,6,5,1}};
		int[][]z={{1,2,3,4},{4,5,6,8},{7,8,9,3},{1,3,3,4}};
		boolean[] a=new boolean[m.length];
		/////////////////////////////////////////////////////
		for(int i=0;i<m.length;i++){
			a[i]=righe(m[i],z[i]);
		}
		System.out.println(" ");
		
		for(int i=0;i<m.length;i++){
			System.out.println(a[i]);
		}
		///////////////////////////////////////////////////
	}
}
	
Dovrebbe confrontare le RIGHE di due matrici che gli vengono passate come argomento e deve restituire:
TRUE se sono presenti righe con elementi uguali, FALSE altrimenti.
Il problema è che cosi restituisce true se confronto la riga 0 della matrice M con la riga 0 della matrice Z,la riga 1 della matrice M con la riga 1 della matrice Z e cosi via.. invece deve restituirmi true anche se confronto la riga 0 della matrice M con la riga 3 della matrice Z.
Credo che la soluzione necessiti di un indice di riga per la matrice M che rimanga fisso e che viene incrementato solo dopo che tutte le righe della matrice Z sono state confrontate; ma non riesco a scriverlo a livello di codice. Potreste darmi una mano?
Grazie.

11 Risposte

  • Re: Confronto righe di matrici

    Jevilik ha scritto:


    TRUE se sono presenti righe con elementi uguali, FALSE altrimenti.
    Il problema è che cosi restituisce true se confronto la riga 0 della matrice M con la riga 0 della matrice Z,la riga 1 della matrice M con la riga 1 della matrice Z e cosi via.. invece deve restituirmi true anche se confronto la riga 0 della matrice M con la riga 3 della matrice Z.
    Quindi "se una qualunque riga della matrice M è uguale ad una qualunque riga della matrice Z". Giusto?

    Bene, se è così allora devi fare un doppio ciclo annidato. Ciascuna riga di M la devi confrontare con ciascuna riga di Z. Quindi un ciclo per le righe in M con dentro un ciclo per le righe in Z.
    Se es. la riga 0 di M è uguale alla riga 3 di Z ... così lo scopri.


    P.S. se vuoi confrontare due array int[] sappi che esiste in java.util.Arrays il metodo

    public static boolean equals(int[] a, int[] a2)

    che è già fatto apposta per questo.
  • Re: Confronto righe di matrici

    andbin ha scritto:


    Jevilik ha scritto:


    TRUE se sono presenti righe con elementi uguali, FALSE altrimenti.
    Il problema è che cosi restituisce true se confronto la riga 0 della matrice M con la riga 0 della matrice Z,la riga 1 della matrice M con la riga 1 della matrice Z e cosi via.. invece deve restituirmi true anche se confronto la riga 0 della matrice M con la riga 3 della matrice Z.
    Quindi "se una qualunque riga della matrice M è uguale ad una qualunque riga della matrice Z". Giusto?

    Bene, se è così allora devi fare un doppio ciclo annidato. Ciascuna riga di M la devi confrontare con ciascuna riga di Z. Quindi un ciclo per le righe in M con dentro un ciclo per le righe in Z.
    Se es. la riga 0 di M è uguale alla riga 3 di Z ... così lo scopri.


    P.S. se vuoi confrontare due array int[] sappi che esiste in java.util.Arrays il metodo

    public static boolean equals(int[] a, int[] a2)

    che è già fatto apposta per questo.
    Non credo di aver capito all'inizio avevo adottato una soluzione del genere -con risultato analogo al codice incollato prima!
    
    	public static boolean prova(int[][]a,int[][]b){
    		for(int i=0;i<a.length;i++){
    			for(int j=0;j<a[i].length;j++){
    		
    				if(a[i][j]!=b[i][j])
    					return false;
    			}
    		}
    		return true;
    	}
    	
    
    Potresti farmi un esempio di soluzione funzionante per fare un confronto e capire dove sbaglio? Grazie
  • Re: Confronto righe di matrici

    Jevilik ha scritto:


    Non credo di aver capito
    Allora: se ci fossero i due array es. (li metto a fianco, così è più chiaro):
    int[][] m = {              int[][] z = {
      { 1, 4, 6 },               { 8, 1, 5 },
      { 7, 3, 2 },               { 1, 4, 6 },
      { 8, 1, 5 }                { 4, 5, 7 }
    };                         };
    Se tu vuoi arrivare a scoprire che:
    - la riga m[0] è uguale alla riga z[1]
    - la riga m[2] è uguale alla riga z[0]

    allora devi "provare" tutte le combinazioni possibili tra le righe di m e z:

    la riga m[0] con tutte le righe di z
    la riga m[1] con tutte le righe di z
    ecc...

    In sostanza quello che c'è da fare è un doppio ciclo for annidato, in cui quello esterno scansioni le righe di m e in quello interno le righe di z (o all'inverso, scegli tu da dove partire).

    Quando all'interno dei due for hai un m[j] e un z[k] ovvero hai due righe, allora come ho detto prima puoi usare il equals di java.util.Arrays ma puoi anche usare quel boolean righe(int[]a,int[]b) che hai mostrato prima (il nome "righe" non è molto significativo, sarebbe stato meglio es. arrayUguali ).

    Insomma: prima le combinazioni tra le righe, poi con una riga di m e una di z chiaramente dovrai confrontare i loro elementi e ripeto o usi qualcosa di già fatto (Arrays.equals) o lo fai tu appunto con un ulteriore ciclo.

    Altra questione

    Da tutta questa analisi, cosa vuoi ottenere? Dico 3 scenari sensati/ragionevoli:
    a) ottenere un singolo true se esiste ALMENO UNA corrispondenza tra una riga di m e una di z?
    b) ottenere un valore int che dice esattamente quante corrispondenze hai trovato (nel mio esempio sopra: 2)
    c) ottenere un elenco puntuale di tutti gli indici di m/z in cui c'è una corrispondenza?
  • Re: Confronto righe di matrici

    andbin ha scritto:


    In sostanza quello che c'è da fare è un doppio ciclo for annidato, in cui quello esterno scansioni le righe di m e in quello interno le righe di z (o all'inverso, scegli tu da dove partire).
    Ma un doppio ciclo for annidato per la scansione lo faccio nel metodo "prova" scritto nel post precedente, manca qualche pezzo? continuo a non capire dove sta la parte mancante nel codice

    andbin ha scritto:


    puoi usare il equals di java.util.Arrays
    No, la traccia dell'esercizio specifica che non si può usare!!

    andbin ha scritto:


    Altra questione

    Da tutta questa analisi, cosa vuoi ottenere? Dico 3 scenari sensati/ragionevoli:
    a) ottenere un singolo true se esiste ALMENO UNA corrispondenza tra una riga di m e una di z?
    b) ottenere un valore int che dice esattamente quante corrispondenze hai trovato (nel mio esempio sopra: 2)
    c) ottenere un elenco puntuale di tutti gli indici di m/z in cui c'è una corrispondenza?
    a) ottenere un singolo true se esiste ALMENO UNA corrispondenza tra una riga di m e una di z, FALSE altrimenti.
    Ovviamente l'esercizi ha più matrici diverse da confrontare, io ne ho incollata una sola per comodità.
  • Re: Confronto righe di matrici

    Jevilik ha scritto:


    Ma un doppio ciclo for annidato per la scansione lo faccio nel metodo "prova" scritto nel post precedente, manca qualche pezzo? continuo a non capire dove sta la parte mancante nel codice
    Nel tuo codice
       public static boolean prova(int[][]a,int[][]b){
          for(int i=0;i<a.length;i++){
             for(int j=0;j<a[i].length;j++){
    è sì un doppio ciclo annidato MA quello esterno scansiona le righe di a (presupponendo implicitamente che anche b abbia lo stesso numero di righe) mentre il ciclo interno confronta gli elementi di due righe di a e b.

    e nota appunto:

    if(a[i][j]!=b[i][j])

    Ovvero l'indice di riga è sempre i quindi i confronti sono solo tra

    riga a[0] e riga b[0]
    riga a[1] e riga b[1]
    riga a[2] e riga b[2]

    Il tuo codice NON può confrontare es. la riga a[0] con la riga b[2] quindi non potresti mai scoprire se la riga a[0] è uguale alla riga b[2].

    Se rileggi il mio esempio di prima, dicevo:

    andbin ha scritto:


    Se tu vuoi arrivare a scoprire che:
    - la riga m[0] è uguale alla riga z[1]
    - la riga m[2] è uguale alla riga z[0]
    Se è questo (come immagino) che vuoi fare allora devi provare TUTTE le combinazioni tra le righe di a e b.
    Per cortesia, rileggi il mio precedente post.

    Jevilik ha scritto:


    andbin ha scritto:


    puoi usare il equals di java.util.Arrays
    No, la traccia dell'esercizio specifica che non si può usare!!
    Va bene non c'è problema. Devi scriverne tu uno similare (cosa che hai fatto anche se è meno robusto del Arrays.equals).

    Jevilik ha scritto:


    a) ottenere un singolo true se esiste ALMENO UNA corrispondenza tra una riga di m e una di z, FALSE altrimenti.
    Ovviamente l'esercizi ha più matrici diverse da confrontare, io ne ho incollata una sola per comodità.
    Perfetto. Allora appena trovi una corrispondenza hai già il risultato "true". Solo quando hai finito tutto quanto e non hai trovato una corrispondenza, allora puoi stabilire che il risultato è "false".
  • Re: Confronto righe di matrici

    andbin ha scritto:


    Jevilik ha scritto:


    Ma un doppio ciclo for annidato per la scansione lo faccio nel metodo "prova" scritto nel post precedente, manca qualche pezzo? continuo a non capire dove sta la parte mancante nel codice
    Nel tuo codice
       public static boolean prova(int[][]a,int[][]b){
          for(int i=0;i<a.length;i++){
             for(int j=0;j<a[i].length;j++){
    è sì un doppio ciclo annidato MA quello esterno scansiona le righe di a (presupponendo implicitamente che anche b abbia lo stesso numero di righe) mentre il ciclo interno confronta gli elementi di due righe di a e b.

    e nota appunto:

    if(a[i][j]!=b[i][j])

    Ovvero l'indice di riga è sempre i quindi i confronti sono solo tra

    riga a[0] e riga b[0]
    riga a[1] e riga b[1]
    riga a[2] e riga b[2]

    Il tuo codice NON può confrontare es. la riga a[0] con la riga b[2] quindi non potresti mai scoprire se la riga a[0] è uguale alla riga b[2].

    Se rileggi il mio esempio di prima, dicevo:

    andbin ha scritto:


    Se tu vuoi arrivare a scoprire che:
    - la riga m[0] è uguale alla riga z[1]
    - la riga m[2] è uguale alla riga z[0]
    Se è questo (come immagino) che vuoi fare allora devi provare TUTTE le combinazioni tra le righe di a e b.
    Per cortesia, rileggi il mio precedente post.
    Bho! Capisco quello che dici e dove sta il problema (è quello che dicevo pure io nel primo post), ma non riesco a capire come far variare l'indice di riga della matrice Z per fare il confronto if(a[i][j]!=b[Z][j])
    Mi arrendo, vedrò di andare parlarne con il professore...al momento non ci arrivo proprio!
    Grazie per l'aiuto!
  • Re: Confronto righe di matrici

    Jevilik ha scritto:


    Bho! Capisco quello che dici e dove sta il problema (è quello che dicevo pure io nel primo post), ma non riesco a capire come far variare l'indice di riga della matrice Z per fare il confronto if(a[i][j]!=b[Z][j])
    Un ciclo esterno per ciclare sulla lunghezza di a quindi hai un indice j, poi un ciclo più interno per ciclare sulla lunghezza di b quindi hai un indice k.
    E dentro questi due cicli quindi hai le righe a[j] e b[k]. Ora devi confrontare tutti gli elementi di queste due righe (quindi a[j][x] e b[k][x] con x da 0 a n) e conviene farsi un piccolo metodo apposito (ripeto, l'hai già fatto anche se non è "robusto" come Arrays.equals).

    Non capisco la difficoltà (oltretutto spiegato più volte).
  • Re: Confronto righe di matrici

    andbin ha scritto:


    Non capisco la difficoltà (oltretutto spiegato più volte).
    La difficoltà sta nel fatto che credo di aver fatto quello che dice a livello di codice, ma continua a ritornarmi tutti false
    	public static boolean arrayUguali(int[]a,int[]b){
    			for(int i=0;i<a.length;i++){
    				for(int j=0;j<a.length;j++){
    					if(a[i]!=b[j])
    						return false;
    			}
    		}
    		return true;
    	}
    		
    	public static void main(String[] args){
    		
    		int[][]m={{1,3,3,4},{4,5,6,8},{7,8,9,3},{8,6,5,1}};
    		int[][]z={{1,2,3,4},{4,5,6,8},{7,8,9,3},{1,3,3,4}};
    		boolean[] a=new boolean[m.length];
    		
    		
    		for(int i=0;i<m.length;i++){
    			for(int j=0;j<z.length;j++){
    				a[i]=arrayUguali(m[i],z[j]);
    			}
    		}
    		System.out.println(" ");
    		
    		for(int i=0;i<m.length;i++){
    			System.out.println(a[i]);
    		}
    	}
  • Re: Confronto righe di matrici

    Jevilik ha scritto:


    	public static boolean arrayUguali(int[]a,int[]b){
    			for(int i=0;i<a.length;i++){
    				for(int j=0;j<a.length;j++){
    					if(a[i]!=b[j])
    						return false;
    			}
    		}
    		return true;
    	}
    Questo NON ha senso. Qui hai 2 array monodimensionali (ovvero due righe della tua matrice, ma questo metodo non lo sa, sono solo 2 array int[] ).
    Quindi qui NON c'è bisogno di cicli annidati. Basta solo UN ciclo lineare per confrontare gli elementi.

    E lo ripeto ancora l'hai già fatto, è quello postato all'inizio della discussione, sebbene non è "robusto" come Arrays.equals perché presuppone "implicitamente" che a e b abbiano la stessa lunghezza.

    Jevilik ha scritto:


    		for(int i=0;i<m.length;i++){
    			for(int j=0;j<z.length;j++){
    
    Sì, QUESTO è il doppio ciclo annidato per fare tutte le combinazioni sulle righe che intendevo.
    Ma non ha molto senso tenere un array di boolean. Ti basta tenere 1 variabile boolean inizialmente a false. SOLO quando arrayUguali dà true, allora puoi mettere questa variabile a true.
  • Re: Confronto righe di matrici

    andbin ha scritto:


    Jevilik ha scritto:


    	public static boolean arrayUguali(int[]a,int[]b){
    			for(int i=0;i<a.length;i++){
    				for(int j=0;j<a.length;j++){
    					if(a[i]!=b[j])
    						return false;
    			}
    		}
    		return true;
    	}
    Questo NON ha senso. Qui hai 2 array monodimensionali (ovvero due righe della tua matrice, ma questo metodo non lo sa, sono solo 2 array int[] ).
    Quindi qui NON c'è bisogno di cicli annidati. Basta solo UN ciclo lineare per confrontare gli elementi.

    E lo ripeto ancora l'hai già fatto, è quello postato all'inizio della discussione, sebbene non è "robusto" come Arrays.equals perché presuppone "implicitamente" che a e b abbiano la stessa lunghezza.
    Si, scusa quello era uno dei tanti tentativi per cercare di risolverlo. Ho fatto copia/incolla della parte di codice sbagliata senza accorgermene
    Volevo incollare questo
    	public static boolean arrayUguali(int[][]a,int[][]b){
          for(int i=0;i<a.length;i++){
             for(int j=0;j<b.length;j++){
          
                if(a[i][j]!=b[j][j])
                   return false;
    			}
    		}
          return true;
    	}
    	public static void main(String[] args){
    		
    		int[][]m={{1,3,3,4},{4,5,6,8},{7,8,9,3},{8,6,5,1}};
    		int[][]z={{1,2,3,4},{4,5,6,8},{7,8,9,3},{1,3,3,4}};
    		boolean[] a=new boolean[m.length];
    		
    		
    		for(int i=0;i<m.length;i++){
    				a[i]=arrayUguali(m,z);
    			}
    		}
    		System.out.println(" ");
    		
    		for(int i=0;i<m.length;i++){
    			System.out.println(a[i]);
    		}
    	}
  • Re: Confronto righe di matrici

    Jevilik ha scritto:


    Volevo incollare questo
    	public static boolean arrayUguali(int[][]a,int[][]b){
          for(int i=0;i<a.length;i++){
             for(int j=0;j<b.length;j++){
          
                if(a[i][j]!=b[j][j])
                   return false;
    			}
    		}
          return true;
    	}
    Mi spiace, NON HA assolutamente senso. Mentre prima quasi-quasi-quasi c'eri .... ora sei completamente fuori strada.
Devi accedere o registrarti per scrivere nel forum
11 risposte