Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    72

    Esercizio Array bidimensionale

    Salve ragazzi, sono ore che sbatto la testa su questo esercizio...senza aver trovato alcuna soluzione

    Se qualcuno potesse indirizzarmi...ve ne sarei infinitamente grato!

    Ecco il testo dell'esercizio:

    Scrivere un metodo che, dati un array bidimensionale a di interi ed un intero
    k, restituisce un array monodimensionale b di booleani tale che l'elemento b[i] di b vale true
    se nella riga a[i] di a esiste almeno un intero maggiore di k, altrimenti b[i] vale false. Ad
    esempio, dati a = {{3,5,7,9,},{4,-1},{-9,21,5}} e k = 6, il metodo restituisce l'array b
    = {true,false,true}

    E l'esercizio svolto da me...

    codice:
    public class array1_sett_06{
    	public static void main (String []args)
    		int [] [] a = {{3,5,7,9,},{4,-1},{-9,21,5}};
    		int k;
    		int c;
    		boolean [] funzione;
    		c=a.length;
    		k=6;
    		funzione = array_test (a,k,c);
    		System.out.println (funzione);
    		}
    
    		
    		public static boolean [] array_test  (int [] [] a, int k,int c){
    			int i;
    	                int j;
    			i=0;
    			boolean [] b= new boolean [c];
    			while(i<a.length){
    				for(j=0; j<a[i].length; j++){
    					if (k<a[i][j]){
    						b[i] =true;
    						i++;
    						}
    						}
    						b[i]= false;
    						i++;
    					}
    					
    					return b ;
    					}
    					}
    ...il quale mi restituisce il seguente errore in riferimento all'array...
    codice:
    Exception in thread "main" java.lang.ArrayIndexOutBoundsException: 3
      at array1_sett_06.array_test(array1_sett_06:java:20)
      at array1_sett_06.main(array1_sett_06:java:9)
    Un grazie in anticipo a tutti!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ecco i punti che non vanno.

    1) In array_test() non serve affatto che abbia il parametro int c, in quanto la dimensione dell'array di boolean la determini dal numero di righe nell'array bidimensionale 'a' ... che il metodo già riceve!

    2) In array_test() invece del primo while usa un for.

    3) La logica del ciclo interno è sbagliata. Se k<a[i][j] metti il flag a true e questo è ok. Ma incrementi 'i' (no è sbagliato!) e il ciclo interno comunque continua (sbagliato).

    4) Fai un println direttamente dell'array di boolean. Questo non ti stampa i valori!!! Ti stamperà una dicitura che potrà sembrarti strana tipo [Z@19821f.
    Non è questo che volevi e non è così che funziona. O fai un ciclo e stampi ogni singolo boolean oppure usi il metodo statico di utilità String toString(boolean[] a) di java.util.Arrays (nota: solo da Java 5).

    Suggerimenti:
    Quando si istanzia un array di boolean, gli elementi sono per default tutti a false. Quindi non ti serve settare un flag espressamente a false.

    Semplicemente fai una scansione sulle righe. Per ogni riga scansioni le colonne. Al primo valore maggiore di k, metti il flag a true e poi termini immediatamente il ciclo interno.
    Tutto qui.

    Ah, e il codice è mal indentato.
    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
    Dec 2007
    Messaggi
    72
    Ti ringrazio, sei stato molto gentile e soprattutto chiaro.
    Dunque se ho capito bene...
    1)Evito di passare "c" come parametro, bensì lo dichiaro all'interno del metodo stesso e non nel main.
    2) E' vero che si usano i due cicli for per lo scorrimento dell'array. Tentavo di forzarci un while
    3) Non incremento "i" e io mi chiedo perchè? Se trovo un numero all'interno della dimensione [i] dell'array, posso passare direttamente alla dimensione successiva, ovvero [i+1]. Esempio: {{3,5,7,9,},{4,-1},{-9,21,5}}.
    In a[2][1], avremo 7>k(6) quindi copio true all'interno dell'array Booleano e incremento "i" visto che mi trovo all'interno del secondo ciclo for (che scorre la dimensione "j").
    4) Tu dici "O fai un ciclo e stampi ogni singolo boolean", ma l'esercizio non chiede questo. Devo copiare tutto all'iterno di un array Booleano. Non devo stampare ogni verifica che faccio per ogni intero dell'array.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da visind
    1)Evito di passare "c" come parametro, bensì lo dichiaro all'interno del metodo stesso e non nel main.
    Ma non ti serve proprio ... da nessuna parte. La lunghezza è a.length e questa espressione puoi usarla per istanziare l'array e per il ciclo principale.

    Originariamente inviato da visind
    2) E' vero che si usano i due cicli for per lo scorrimento dell'array. Tentavo di forzarci un while
    Il while non sarebbe tecnicamente sbagliato ma in una situazione del genere (semplice progressione lineare di un indice) è più appropriato un for.

    Originariamente inviato da visind
    3) Non incremento "i" e io mi chiedo perchè? Se trovo un numero all'interno della dimensione [i] dell'array, posso passare direttamente alla dimensione successiva, ovvero [i+1]. Esempio: {{3,5,7,9,},{4,-1},{-9,21,5}}.
    In a[2][1], avremo 7>k(6) quindi copio true all'interno dell'array Booleano e incremento "i" visto
    che mi trovo all'interno del secondo ciclo for (che scorre la dimensione "j").
    No, l'incremento dovrebbe farlo appunto il for esterno!
    Ripeto: scansioni le colonne. Appena trovi un valore maggiore di k, metti a true il flag e termini il ciclo interno. Il ciclo esterno proseguirà, eseguendo la espressione di incremento i++, ritestando la condizione ecc...

    E dovresti sapere come far terminare un ciclo.

    Originariamente inviato da visind
    4) Tu dici "O fai un ciclo e stampi ogni singolo boolean", ma l'esercizio non chiede questo. Devo copiare tutto all'iterno di un array Booleano. Non devo stampare ogni verifica che faccio per ogni intero dell'array.
    Nel main() hai fatto un println dell'array di boolean. No?? Io vedo quello! Leggi cosa hai postato prima.
    E questo println, così come l'hai fatto, non ti stampa i valori dell'array.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    72
    Tutto chiaro, e ti ringrazio nuovamente, solo che avrei bisogno che mi spiegassi una cosa...
    Come faccio a stampare i valori dell'array se non in quel modo?

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da visind
    Tutto chiaro, e ti ringrazio nuovamente, solo che avrei bisogno che mi spiegassi una cosa...
    Come faccio a stampare i valori dell'array se non in quel modo?
    Ehm...
    Originariamente inviato da andbin
    4) Fai un println direttamente dell'array di boolean. Questo non ti stampa i valori!!! Ti stamperà una dicitura che potrà sembrarti strana tipo [Z@19821f.
    Non è questo che volevi e non è così che funziona. O fai un ciclo e stampi ogni singolo boolean oppure usi il metodo statico di utilità String toString(boolean[] a) di java.util.Arrays (nota: solo da Java 5).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da visind
    Come faccio a stampare i valori dell'array se non in quel modo?
    Ma l'ho detto:

    a) Classico ciclo for, quindi stampi elemento per elemento.

    b) Ottieni una bella stringa già ben formata tramite il toString(boolean[] a) di java.util.Arrays (e ripeto solo da Java 5).

    c) Eventuale altra soluzione: ti fai un metodo che dato un boolean[] ritorna un String e la stringa la componi tu, ad esempio separando gli elementi da uno spazio o virgola o altro. Ma faresti praticamente più o meno lo stesso lavoro che fa il toString() di Arrays!!
    Con il fatto che se non lo fai in modo "accurato" ed efficiente usando ad esempio StringBuffer/StringBuilder rischieresti di fare un metodo più brutto ed inefficiente rispetto a quello di Arrays (p.s. non sarebbe comunque un grosso problema, credo, visto l'esercizio che è a livello "didattico").
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    232
    Scusate anchio avrei un problema.. in pratica dovrei prendere in input un array bidimensionale frastagliato A di stringhe e restituire un boolean se esiste in A una colonna contenente 3 stringhe con lo stesso carattere finale (attenzione alle stringhe mancanti) e l' errore è qll di uscire fuori dal range!Avete soluzioni?!? Qst è il codice:

    codice:
     public static boolean metodo(String[][]A){
    		int cont=0;
    		int max=0;
    		for(int x=0; x<A.length; x++){
    			if(A.length>max)
    				max=A.length;
    		}
    		System.out.println(max);      //colonna massima
    		for(int j=0; j<max; j++){
    			for(int i=0; i<A.length; i++){
    				cont=0;
    					System.out.println(A[i][j].charAt(A[i][j].length()-1));
    				
    				
    				for(int k=0; k<A[i].length; k++){
    					
    				//	System.out.println(A[i][k].charAt(A[i][k].length()-1));
    						if(j<A[i].length)  
    			
    					
    					if(A[i][j].charAt(A[i][j].length()-1) == A[i][k].charAt(A[i][k].length()-1))
    						cont++;
    					if(cont==3)
    				         return true;
    				     
    				}
    			}
    		}
    		return false;
    	}

  9. #9
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    questo non ha senso cancellalo
    codice:
    for(int x=0; x<A.length; x++){
    	if(A.length>max)
    		max=A.length;
    }
    cambia
    codice:
    for(int j=0; j<max; j++){
    	for(int i=0; i<A.length; i++){
    in
    codice:
    for(int j=0; j<A.length; j++){
    	for(int i=0; i<A[0].length; i++){

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    232
    scusa ma così non fa sempre le righe??..

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.