Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 40
  1. #1

    [JAVA]algoritmo per trovare il massimo array di stringhe,date 2 matrici e 1 array

    ciao ,vi spiego in poche parole quello che vorrei fare:
    in input ho:
    data una matrice triangolare:
    ** j1 j2 j3 j4
    j1:-1
    j2: 2 -1
    j3: 3 2 -1
    j4: 4 2 3 -1

    un array di 4 stringhe(lavori):
    j1:abcd
    j2:bca
    j3:cabc
    j4:abcd

    e una matrice di interi: (in cui ogni valore è associato ai caratteri delle rispettive stringhe)
    ** j1 j2 j3 j4
    j1:10 10 10 1
    j2: 5 5 4 0
    j3: 1 20 20 20
    j4: 1 10 1 10

    per ogni colonna della matrice triangolare: trovo il max valore ad esempio nel mio caso (4)che corrisponde agli indici [j1][j4],inserisco quindi j1 e j4 dell'array di stringhe in un array I1 e le stringhe j2 e j3 in un array I2.
    dopo questo passo devo verificare se il peso delle stringhe di I1>del peso delle stringhe di I2,quindi dalla matrice di interi prendo (j1 e j4)=I1(peso) e faccio la somma dei valori,la stessa cosa con (j2 e j4)=I2 ,se I1(peso)>I2(peso) mi fermo e restituisco l'array di stringhe I1.

    se invece I1<=I2,ripeto le operazioni non considerando la righa in corrispondenza del max precedente etrovando un nuovo massimo,nel mio caso (3)
    corrisponde agli indici [j1][j3],inserisco quindi j3 dell'array di stringhe nell' array I1 quindi I1=(j1,j3,j4) e tolgo la stringa j3 dall'array I2,quindi I2=(j2)
    dopo questo passo devo verificare se il peso delle stringhe di I1>del peso delle stringhe di I2,quindi dalla matrice di interi prendo (j1 e j4e j3)=I1(peso) e faccio la somma dei valori,la stessa cosa con I2 che adesso vale=(j2) ,se I1(peso)>I2(peso) mi fermo e restituisco l'array di stringhe I1.altrimenti proseguo...

    Sto provando da un pò a vedere come implementare questo algoritmo ma con non poche difficoltà,questo il codice che ho scritto:ma eseguendolo mi stampa questo :
    -1
    2 -1
    3 2 -1
    4 2 3 -1
    null
    null
    null
    null

    ma invece io voglio che mi ritorni un array di stringhe!!qualcuno mi sa dire dove sbaglio??perchè??grazie

    codice:
    package lcs;
    public class Massimo {
    	public static String [] InsiemeMaggiore(int [][] matrice,String [] job,int [][]tempoProc){
    		int righa,colonna;
    		int i,j;
    		String[]I1 =new String[job.length];
    		String[]I2 =new String[job.length];
    		
    		int max = -1;
    		int [] indiceRigha  = new int[matrice.length];
    		indiceRigha[0]=-1;//array non nullo
    		/*scandisco le colonne e per ogni colonna 
    		 * scandisco le righe e trovo il massimo della colonna j*/
    		for(j=0; j<matrice[0].length;j++){
    			int sommaI1=0;
    			int sommaI2=-1;
    			if(sommaI2>=sommaI1){
    				for(i=j+1; i<matrice.length;i++){
    					for(i=0;i<indiceRigha.length;i++){
    						if((matrice[i][j]>max)&&(indiceRigha[i]!=i)){
    							max=matrice[i][j];
    						}
    						colonna=j;
    						righa=i;
    						indiceRigha[i]+=righa;
    						/*inserisco le rispettive stringhe in 
    						 * corrispondenza del max trovato negli
    						 *  arrayI1 e I2*/
    						for(i=0;i<job.length;i++){
    							if((i==righa)||(i==colonna)){
    								I1[i]+=job[i];
    							}
    							else{
    								I2[i]+=job[i];
    							}
    							int indexRimuovi=righa;
    							I2[indexRimuovi]=I2[I2.length-1];
    							I2 = ArrayRidimensionato.resize(I2, I2.length-1);
    						}
    						/*calcolo il tempo di processamento dei pesi associati
    						 * alle stringhe che si trovano in I1 e I2
    						 */
    						for(i=0;i<tempoProc.length;i++){
    					    	for(j=0;j<tempoProc[i].length;j++){
    					    		if((i==righa)||(i==colonna)){
    					    			sommaI1+=tempoProc[i][j];
    					    			System.out.println(sommaI1);
    					    		}
    					    		else{
    					    			sommaI2+=tempoProc[i][j];
    					    			System.out.println(sommaI2);
    					    		}
    					    		sommaI2 -=tempoProc[i][j];
    					    	}
    					    }System.out.println(sommaI1);
    					}
    				}
    			}
    		}
    		return I1;
    	}
    }
    codice:
    package lcs;
    /*ridimensiona l'array eliminando la righa*/
    public class ArrayRidimensionato {
    	public static String[] resize(String[] oldArray,int newLength){
    		if (newLength < 0)
    			throw new IllegalArgumentException();
    			String[] newArray = new String[newLength];
    			int count = oldArray.length;
    			if (newLength < count) count = newLength;
    			for (int i = 0; i < count; i++)
    			newArray[i] = oldArray[i];
    			return newArray;
    	}
    
    }
    codice:
    package lcs;
    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);
    		
    		int[][] matrice =new int[][]{{10,10,10,1},{5,5,4,0},{1,20,20,20},{1,10,1,10}};
    		String[]insieme=new String[matrice.length];
    		insieme=Massimo.InsiemeMaggiore(m,job,matrice);
    		for(int i=0;i<insieme.length;i++){
    			System.out.println(insieme[i]+"");
    		}
    	}
    }

  2. #2
    nessuno ha qualche idea,qualche consiglio da darmi??grazie

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    L'array I1 non viene riempito e quindi nel main ti stampa 4 null. I numeri prima che stampa a video sono stampe che hai messo in qua e la' nel codice. Posso chiederti, di grazia, qual'e' lo scopo di tutto questo procedimento? Qual'era il tuo obbiettivo iniziale (se e' un esercizio, posta pure il testo)? Magari hai preso una strada piu' lunga del necessario.

  4. #4
    grazie per la risposta simo7784,quello che voglio fare lo ho specificato all'inizio del mio post precedente,cmq devo implementare un algoritmo che esegua i seguenti passi:

    io in input ho la matrice : (che ho suddiviso in 1 matrice di interi e in un array di stringhe),
    i caratteri rappresentano macchine da lavoro, gli interi sono i tempi di processamento associati a ogni macchina e i vari j rappresentano delle lavorazioni.
    ------------------------
    j1:a-10 b-10 c-10 d-1
    j2:b-5 c-5 a-4
    j3:c-1 a-20 b-20 c-20
    j4:a-1 b-10 c-1 d-10
    ---------------------------
    array di stringhe
    j1:abcd
    j2:bca
    j3:cabc
    j4:abcd

    e una matrice di interi:
    0 1 2 3
    ----------------
    0 j1:10 10 10 1
    1 j2: 5 5 4 0
    2 j3: 1 20 20 20
    3 j4: 1 10 1 10

    inoltre ho la matrice triangolare: (che mi sono ricavato in precedenza)
    ** j1 j2 j3 j4
    j1:-1
    j2: 2 -1
    j3: 3 2 -1
    j4: 4 2 3 -1

    per ogni colonna della matrice triangolare:
    1) bisogna trovare il max valore ad esempio nel mio caso (4)che corrisponde agli indici [j1][j4],inserisco quindi j1 e j4 dell'array di stringhe (che corrispondono agli indici del max trovato )in un array I1 e le stringhe j2 e j3 in un array I2.
    dopo questo passo devo verificare se il peso associato alle stringhe di I1 è > del peso associato a quello delle stringhe di I2,quindi dalla matrice di interi prendo per righe (j1 e j4)che appartengono a I1 e faccio la somma dei valori,la stessa cosa con (j2 e j4)che appartengono a I2 ,se I1(peso)>I2(peso) mi fermo e restituisco l'array di stringhe I1.

    se invece I1<=I2,ripeto le operazioni non considerando la righa in corrispondenza del max precedente e trovando un nuovo massimo,nel mio caso (3)
    corrisponde agli indici [j1][j3],inserisco quindi j3 dell'array di stringhe nell' array I1 quindi I1=(j1,j3,j4) e tolgo la stringa j3 dall'array I2,quindi I2=(j2)
    dopo questo passo devo verificare se il peso delle stringhe di I1>del peso delle stringhe di I2,quindi dalla matrice di interi prendo (j1 e j4e j3)=I1(peso) e faccio la somma dei valori,la stessa cosa con I2 che adesso vale=(j2) ,se I1(peso)>I2(peso) mi fermo e restituisco l'array di stringhe I1.altrimenti proseguo...trovando un altro max lungo la colonna e rieseguendo le operazioni precedenti fino a quando il peso di I1> del peso di i2.

    credo che sia abbastanza chiaro quello che voglio ottenere o no?? !!qualche indicazione??grazie mille

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    EDIT: Uno dei problemi e' sicuramente il fatto che gli array l1 e l2 non sono inizializzati. Se concateni una stringa a null ottieni sempre null;
    dopo che hai dichiarato i due array fai
    codice:
    for(i=0; i<job.length; i++) {
       l1[i]="";
       l2[i]="";
    }
    Prova ad eseguire e guarda se e' migliorato qualcosa.

  6. #6
    facendo come dici tu qualcosa è migliorata nel senso che adesso non stampa piu la serie di null ma stampa soltanto la matrice :master: ,però non è quello che io mi aspetto!!

    cmq i problemi maggiori li ho nello svolgimento del secondo passo dell'algoritmo quando devo trovare il massimo successivo ,quindi non considerare la righa del max precedente e spostare ed aggiungere le stringhe agli array I1 e I2!!volendo implementare questi passaggi credo di aver incasinato un po tutto!!

    hai qualche suggerimento da darmi ?'grazie ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    codice:
    int sommaI1=0;
    //int sommaI2=-1;
    int sommaI2=1;
    if(sommaI2>=sommaI1){
    Altrimenti non entra mai nel if e quindi I1 resta vuoto.
    Corretto quell'errore pero' ne salta fuori un altro perche' ridimensioni l'array I2.
    Secondo me dovresti ripartire da 0 con quest'ultima classe e implementare il codice esattamente come lo spieghi a parole.
    Probabilmente ci sono degli errori negli spostamenti e mettersi a cercarli e' piu' faticoso che ripartire da 0.
    Dividi il tuo algoritmo in passi e ad ogni passo non banale testa se fa esattamente cio' che vuoi.

    P.s. Non occorre che fai una classe per ogni metodo statico, puoi benissimo metterli tutti nella stessa classe.

  8. #8
    e si infatti correggendo quell'errore mi da errore proprio sull'array I2:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
    at lcs.Massimo.InsiemeMaggiore(Massimo.java:38)
    at lcs.provaLcs.main(provaLcs.java:16)

    proverò a riprenderlo dall'inizio,ma una cosa è spiegarlo a parole ,tutt'altro è implementarlo e soprattutto nella parte in cui dovrei ridimensionare gli array che sorgono i problemi cmq grazie dei consigli, ciao

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Arriva fino alla parte del ridimensionamento per ora (senza farlo) e guarda se fino li' va tutto ok. Poi pensiamo anche a quello.

  10. #10
    allora ho ripreso a impostare l'algoritmo dall'inizio...e mi è sorto il primo problema...

    codice:
    public class Massimo {
    	public static String [] InsiemeMaggiore(int [][] matrice,String [] job,int [][]tempoProc){
    		int righa,colonna;
    		int i,j;
    		String[]I1 =new String[job.length];
    		String[]I2 =new String[job.length];
    		/*for(i=0; i<job.length; i++) {
    			   I1[i]="";
    			   I2[i]="";
    		}	*/
    		int max =0;
    		righa=0;
    		colonna=0;
    		/*scandisco le colonne e per ogni colonna 
    		 * scandisco le righe e trovo il massimo della colonna j*/
    		for(j=0; j<matrice[0].length;j++){
    				for(i=j+1; i<matrice.length;i++){
    						if(matrice[i][j]>max){
    							max=matrice[i][j];
    							righa=i;
    							colonna=j;
    					    }
    						for(i=0;i<job.length;i++){
    							if((i==righa)||(i==colonna)){
    								for(i=0;i<I1.length;i++){
    								    I1[i]=job[i];
    								}
    							}
    							else
    								I2[i]=job[i];
    							
    						}
    				}
    		}
    		return I1;
    	}
    }
    codice:
    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);
    		System.out.println("-----------");
    		
    		int[][] matrice =new int[][]{{10,10,10,1},{5,5,4,0},{1,20,20,20},{1,10,1,10}};
    		String[]insieme=new String[matrice.length];
    		insieme=Massimo.InsiemeMaggiore(m,job,matrice);
    		for(int i=0;i<insieme.length;i++){
    			System.out.print(insieme[i]+" ");
    		}
    	}
    }

    quando mando in esecuzione mi stampa:

    -1
    2 -1
    3 2 -1
    4 2 3 -1
    -----------
    abcd bca cabc abcd

    quindi mi mette nell'array I1 tutte le stringhe ma quello che io mi aspetto però è il ritorno di un array I1 contenente soltanto la stringhe che soddisfano la condizione if ossia abcd abcd che corrispondono alle stringhe j1 e j1 dell'array i stringhe.mentre nell'array I2 metto le stringhe che non soddisfano la condizione if

    qualcuno sa dirmi in cosa sbaglio e come fare??grazie

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.