Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [java]Inserimento Di elementi in un Array

    ciao a tutti!!
    vi espongo il mio problema,e spero che qualcuno mi aiuti!!

    Problema:dato un insieme di lavori ,stringhe(io ho considerato un array di stringhe)trovare per ogni coppia di lavori la lunghezza della piu lunga sottostringa comune,quindi inserire questi valori trovati in una matrice simmetrica,quindi basta considerare soltanto una matrice inferiore/superiore, lungo la diagonale principale bisogna mettere -1,

    ad esempio:
    ho 4 lavori/stringhe:
    j1:abcd j1 j2 j3 j4
    j2:bca j1 -1 2 3 4
    j3:cabc
    j4:abcd j2 2 -1 2 2

    j3 3 2 -1 3

    j4 4 2 3 -1
    quindi per ogni coppia trovo la max lunghezza!!ad esempio tra j1 e j2 la max lunghezza è 2 e inserisco questo valore nella matrice nel rispettivo campo [j1][j2]e proseguofino a riempire la matrice,e infine mi faccio restituire la matrice!!

    spero che qualcuno mi possa aiutare nel risolvere questo problema visto che è parte della mia tesi!!Ho provato a farlo ma credo di essermi incartato!!se potreste postarmi qualche soluzione al problema ve ne sarei grato!!
    io ho fatto cosi, ma mi da l'errore di accesso a un aray fuori i limiti :
    2
    -1
    -1
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at lcs.Matrice.mLunghezzaSottostringa(Matrice.java:29 )
    at lcs.provaLcs.main(provaLcs.java:18)

    codice:
    package lcs;
    
    import java.util.List;
    
    public class Matrice {
    	public static int[][] mLunghezzaSottostringa(String[]job){
    		int[][]matrice;
    		int i,j;
    		int sottostringa=0;
    		
    		/*creo una matrice triangolare inferiore in cui 
    		 * inserire i valori*/
    		matrice = new int [job.length][];
    		for(i=0; i<matrice.length;i++) {
    			matrice[i] =new int[i+1];
    		}
    			        /*confronto le stringhe due per volta*/
    					for(i=0;i<job.length;i++){
    		                for(j=i+1;i<job.length;j++){
                                           /*trovo la lunghezza della sottostringa tra due stringhe*/
    		                	sottostringa= Lcs.longestCommonSubstring(job[i], job[j]);
    					        System.out.println(sottostringa);
    					        /*asesso vorrei inserire nella matrice triangolare 
    					         * -1 sulla diagonale e per ogni riga 
    					         * i rispettivi valori
    					         * scorrendo la matrice inserisco i valori*/
    							for(i=0; i<matrice[i].length;i++){
    								for(j=0;i<matrice[i].length;j++){
    									if(i==j){/*se l'indice di righa==indice di colonna*/
    										matrice[i][j]=-1;
    					    	            System.out.println(matrice[i][j]+"");
    					                }else
    					                matrice[i][j]=sottostringa;
    					                System.out.println(matrice[i][j]+"");
    		                        }
    					         }
    				        }
    			         }
    					return matrice;
    	}
    }
    codice:
    package lcs;
    import java.util.*;
    
    public class provaLcs {
    	public static void main(String[] args) {
    		String a ="abcd";
    		String b ="bca";
    		String c ="cabc";
    		String d ="abcd";
    	        String[] job= new String []{a,b,c,d};
    		int[][] m =new int[job.length][job.length];
    		m=Matrice.mLunghezzaSottostringa(job);

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Beh, l'errore e' dato da che si trova alla riga 29 della classe Matrice come indicato dall'eccezione.
    codice:
    for(j=0;i<matrice[i].length;j++){
    Nel corpo del for, tu non incrementi mai i quindi non esci mai dal for, mentre j viene incrementata ad ogni iterazione quindi arrivi ad un punto in cui tenti di acccedere ad un elemento di indice maggiore della dimensione dell'array e di conseguenza sollevi un'eccezione.
    Intanto correggi quello e guarda poi se ti va il resto.
    P.s. Non ho letto il resto del codice.

  3. #3
    quel problema l'ho risolto ma adesso ne ho un 'altro !
    riporto l'esempio che nel post precedente non si vede bene:
    esempio:
    ho 4 lavori/stringhe:
    j1:abcd
    j2:bca
    j3:cabc
    j4:abcd

    Matrice risultante:
    ***j1 j2 j3 j4
    j1: -1 2 3 4
    j2: 2 -1 2 2
    j3: 3 2 -1 3
    j4: 4 2 3 -1

    quindi per ogni coppia trovo la max lunghezza!!ad esempio tra j1 e j2 la max lunghezza è 2 e inserisco questo valore nella matrice nel rispettivo campo [j1][j2]e proseguofino a riempire la matrice,e infine mi faccio restituire la matrice!!

    il codice dal quale esce il risultato è questo:
    codice:
    public class Matrice {
    	public static int[][] mLunghezzaSottostringa(String[]job){
    		int[][]matrice;
    		int i,j;
    		int sottostringa=0;
    		
    		/*creo una matrice triangolare inferiore in cui 
    		 * inserire i valori*/
    		matrice = new int [job.length][];
    		for(i=0; i<matrice.length;i++) {
    			matrice[i] =new int[i+1];
    		}
    		
    			        /*confronto le stringhe due per volta*/
    					for(i=0;i<job.length;i++){
    		                for(j=i+1;i<job.length;j++){
    		                	sottostringa= Lcs.longestCommonSubstring(job[i], job[j]);
    					        //System.out.println(sottostringa);
    					        /*adesso vorrei inserire nella matrice triangolare 
    					         * -1 sulla diagonale e per ogni riga 
    					         * i rispettivi valori
    					         * scorrendo la matrice inserisco i valori*/
    							for(i=0; i<matrice.length;i++){
    								for(j=0;j<matrice[i].length;j++){
    									   if(i==j){/*se l'indice di righa==indice di colonna*/
    										   matrice[i][j]=-1;
    									       //System.out.println(matrice[i][j]+"");
    									   }
    										else{
    					                       matrice[i][j]=sottostringa;
    								           }
    					                       System.out.println(matrice[i][j]+"");
    						        }
    					         }
    				        }
    			         }
    					return matrice;
    	}
    }
    adesso stampa:
    -1
    2
    -1
    2
    2
    -1
    2
    2
    2
    -1

    che è diverso da quello che io mi aspetto,infatti i valori che mi vengono sono tutti su una colonna e mi vengono tutti di valore 2 dove dovrebbero esserci altri valori,io dovrei avere nella matrice questi valori,visualizzati come sotto:

    1° righa :
    -1
    2° righa
    2 -1
    3°riha
    3 2 -1
    4°righa
    4 2 3 -1

    potete dirmi anche se il codice della matrice triangolare che ho scritto secondo voi è corretto?
    spero qualcuno risponda!!grazie

  4. #4
    nessuno mi da una mano??aiutatemi dai!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Secondo me hai messo due cicli for in piu' e fatto un po' di confusione con il riempimento della matrice.
    Una volta calcolata la sottostringa, puoi direttamente inserirla nella matrice.
    codice:
    public class Matrice {
       public static int[][] mLunghezzaSottostringa(String[]job){
          int[][]matrice;
          int i,j;
          int sottostringa=0;
    
          matrice = new int [job.length][];
          for(i=0; i<matrice.length;i++) {
             matrice[i] =new int[i+1];
          }
    		
          for(i=0;i<job.length;i++){
             for(j=0;j<job.length;j++){
                 //Se i e uguale a j sono sulla diagonale
                 if(i==j) {
                    matrice[i][j]=-1;
                 } else {
                    sottostringa= Lcs.longestCommonSubstring(job[i], job[j]);
                    matrice[i][j]=sottostringa;
                 }
                 System.out.print(matrice[i][j]+" ");//Stampa di controllo
             }
             System.out.println();//Stampa di controllo
          }
          
          return matrice;
       }
    }

  6. #6
    sono sempre io...la soluzione che mi hai proposto sembra valida se non fosse per il seguente errore che mi dà e non riesco a capire come risolverlo:master:

    -1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at lcs.Matrice.mLunghezzaSottostringa(Matrice.java:24 )
    at lcs.provaLcs.main(provaLcs.java:18)

    sulla linea
    codice:
    matrice[i][j]=sottostringa;
    mi sapresti spiegare il motivo dell'errore??e come risolverlo..grazie ancora

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Si scusami, ho scritto di fretta la guardia del secondo ciclo for.
    Sostituisci con
    codice:
    for(j=0;j<i+1;j++){
    Il motivo e' che la matrice e' triangolare, e ogni riga non ha lo stesso numewro di elementi, ma i+1. Il primo for itera sulle righe (che sono job.length), il secondo sulle colonne che alla riga i-esima sono i+1

  8. #8
    grazie mille funziona alla grande!!! e dire che non era complicato come credevo
    adesso posso andare a nanna contento!!

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.