Aiuto metodo Java

di il
11 risposte

Aiuto metodo Java

Ciao ragazzi, sto sbattendo la testa sui metodi in java. Dovrò provare a dare l'esame il 14 settembre ma ho molta difficoltà nei ragionamenti da fare. Non ho capito il perchè si arriva ad una soluzione del genere. Vi posto la consegna e la soluzione. Ci sbatto la testa ma nulla, non riesco a capire la logica per risolvere questi problemi. Passo i pomeriggi interi e non combino nulla.
Due array si dicono simili se contengono gli stessi elementi. Ad esempio, l'array {1,1,3} è simile all'array {1,3,1}. L'array {1,1,3} è simile all'array {3,3,3,1}. Scrivere un metodo static boolean simili (int []a, int []b) che, presi come parametri due array a e b di numeri interi verifica se due array sono simili oppure no. Se i due array sono entrambi null o sono entrambi vuoti, viene restituito true. Si analizzi la complessità temporale del metodo proposto.

Soluzione:

static boolean simili(int[] a, int[] b) {
if (a == null && b == null)
return true; // caso base
if (a.length == 0 && b.length == 0)
return true; // caso base
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
if (a == b[j])
break;
if (j == b.length - 1)
return false;
}

}
for (int j = 0; j < b.length; j++) {
for (int i= 0; i < a.length; i++) {
if (b[j] == a) break;

if (i == a.length - 1)
return false;
}

}
return true;

11 Risposte

  • Re: Aiuto metodo Java

    mattiac2210 ha scritto:


    Non ho capito il perchè si arriva ad una soluzione del genere. Vi posto la consegna e la soluzione.
    La soluzione postata mi pare tecnicamente corretta. Quali sono i dubbi? Il concetto è semplice: bisogna innanzitutto fare le prove da A verso B e poi il contrario per verificare che siano davvero simili. Questo è il motivo per cui ci sono due for principali.
    Preso un valore di A, quando sai che NON è presente in B? Banalmente solo dopo che il for interno ha esaminato tutti i valori in B.

    Tu questo l'hai gestito con un test "in mezzo" al ciclo if (j == b.length - 1) ovvero se non c'è stata uguaglianza prima e sono all'ultimo elemento, allora evidentemente il valore non è stato trovato.

    Ripeto: tecnicamente risulta corretto. Io personalmente l'avrei risolto in altro modo: con il continue con label!

    Se a[i] == b[j] si mette un continue con "etichetta" per far continuare immediatamente il ciclo esterno. Poi DOPO il ciclo interno si mette un return false fisso, perché se arriva lì vuol dire che appunto non ha trovato nulla.
    Questa soluzione tra l'altro non necessiterebbe di usare gli indici, quindi si potrebbe fare con il for-each di Java 5.
    Cioè:
            atob:
            for (int va : a) {
                for (int vb : b) {
                    if (va == vb) {
                        continue atob;
                    }
                }
    
                return false;  // se arriva qui NON ha trovato corrispondenza
            }
    E idem similare per l'altro verso (b to a).
  • Re: Aiuto metodo Java

    andbin ha scritto:


    mattiac2210 ha scritto:


    Non ho capito il perchè si arriva ad una soluzione del genere. Vi posto la consegna e la soluzione.
    La soluzione postata mi pare tecnicamente corretta. Quali sono i dubbi? Il concetto è semplice: bisogna innanzitutto fare le prove da A verso B e poi il contrario per verificare che siano davvero simili. Questo è il motivo per cui ci sono due for principali.
    Preso un valore di A, quando sai che NON è presente in B? Banalmente solo dopo che il for interno ha esaminato tutti i valori in B.

    Tu questo l'hai gestito con un test "in mezzo" al ciclo if (j == b.length - 1) ovvero se non c'è stata uguaglianza prima e sono all'ultimo elemento, allora evidentemente il valore non è stato trovato.

    Ripeto: tecnicamente risulta corretto. Io personalmente l'avrei risolto in altro modo: con il continue con label!

    Se a[i] == b[j] si mette un continue con "etichetta" per far continuare immediatamente il ciclo esterno. Poi DOPO il ciclo interno si mette un return false fisso, perché se arriva lì vuol dire che appunto non ha trovato nulla.
    Questa soluzione tra l'altro non necessiterebbe di usare gli indici, quindi si potrebbe fare con il for-each di Java 5.
    Cioè:
            atob:
            for (int va : a) {
                for (int vb : b) {
                    if (va == vb) {
                        continue atob;
                    }
                }
    
                return false;  // se arriva qui NON ha trovato corrispondenza
            }
    E idem similare per l'altro verso (b to a).
    Purtroppo non capisco dopo il break cosa succede e nella soluzione postata da lei non ricordo il continue con l'etichetta e il ciclo for each. Purtroppo quando faccio queste cose vado in confusione totale e cado nella frustrazione. Ho appena provato a fare un altro esercizio ma non mi torna. Non amo piangermi addosso ma la situazione è questa.
  • Re: Aiuto metodo Java

    mattiac2210 ha scritto:


    Purtroppo non capisco dopo il break cosa succede
    Devi considerare che

    if (j == b.length - 1)

    significa "se j è l'ultimo indice in b" (ovvero, se ci troviamo sull'ultimo valore contenuto in b)
  • Re: Aiuto metodo Java

    andbin ha scritto:


    mattiac2210 ha scritto:


    Purtroppo non capisco dopo il break cosa succede
    Devi considerare che

    if (j == b.length - 1)

    significa "se j è l'ultimo indice in b" (ovvero, se ci troviamo sull'ultimo valore contenuto in b)
    Grazie
  • Re: Aiuto metodo Java

    Sto facendo un altro metodo ma non ci sto capendo nulla sinceramente.
    Devo scrivere un metodo che mi restituisca l'inverso di un array. Dato un array, il suo inverso è dato dall’array in cui la prima cella diviene l’ultima, la seconda la penultima e
    così via (l’ultima cella diviene la prima).
    static int prodottoScalare(int[]b) {
    		int lunghezza=(b.length-1)/2;
    		for (int i=0; i<lunghezza; i++) {
    			for (int j=b.length-1; j<lunghezza; j--) {
    				int scambio=b[i];
    				b[i]=b[j];
    			}
    			
    		}
    		
    	}
  • Re: Aiuto metodo Java

    Hai valorizzato una variabile scambio. Ma poi che fine ha fatto?
  • Re: Aiuto metodo Java

    Oltre a quanto già detto da oregon aggiungo che non serve affatto un doppio for annidato.
  • Re: Aiuto metodo Java

    oregon ha scritto:


    Hai valorizzato una variabile scambio. Ma poi che fine ha fatto?
    L'ho uguagliata a b[j], ma sono sicuro che è sbagliato
  • Re: Aiuto metodo Java

    andbin ha scritto:


    Oltre a quanto già detto da oregon aggiungo che non serve affatto un doppio for annidato.
    Ho capito ma purtroppo mi sono bloccato. Non è colpa mia, ho dei limiti notevoli a riguardo.
  • Re: Aiuto metodo Java

    mattiac2210 ha scritto:


    L'ho uguagliata a b[j], ma sono sicuro che è sbagliato
    In Java non è possibile scambiare "al volo" il valore di 2 variabili (in altri linguaggi sì). Serve sempre una variabile di "appoggio" da usare esplicitamente. Scegli tu da quale delle due variabili partire. Quella che salvi in quella temporanea la puoi settare con il valore dell'altra, ecc...

    mattiac2210 ha scritto:


    Ho capito ma purtroppo mi sono bloccato. Non è colpa mia, ho dei limiti notevoli a riguardo.
    Basta 1 solo for che definisce 2 variabili: i che parte da 0 e va avanti, j che parte da length-1 e va indietro. Quale è la condizione del for? Prova a pensarci ... è banale.
  • Re: Aiuto metodo Java

    Scusate per l'assenza...grazie mille per l'aiuto, ho risolto. Più tardi cerco di postare una soluzione ad un metodo che mi sembra corretta, ma non riesco a capire come poter riuscire a fare un test
Devi accedere o registrarti per scrivere nel forum
11 risposte