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

    [Java] Aiuto vettori !!!

    Salve, sto provando a svolgere l'esercizio scrito nei commenti del seguente codice, il compilatore compila il codice che ho creato solo che quando vado ad eseguirlo mi da un errore.
    Qualkuno potrebbe aiutarmi ?

    Errore che mi da:
    codice:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
          at traccia1a.compattaRepliche(traccia1a.java:19)
          at traccia1a.main(traccia1a.java:41)
    Questo è il codice:
    codice:
    /*
    Si scriva un metodo compattaRepliche che riceve in ingresso un vettore di interi v, 
    e restituisce un vettore di interi w ottenuto riportando in esso i valori presenti 
    una sola volta in v e sostituendo gli elementi replicati con la loro somma. 
    Per eliminare correttamente le repliche, prima di inserire un elemento 
    si suggerisce di controllare se è una replica di uno già considerato. 
    Ad  esempio, se v = [ 7, 3, 3, 4, 1, 8, 6, 6, 6, 7] , 
    il  vettore restituito è w = [14, 6, 4, 1, 8, 18].
    */
    
    public class traccia1a{
    	public static int[] compattaRepliche(int[]v) {
    	int []w = new int[v.length];
    	int c=0;
    	int st=0;
    	int pos=0;
    	for (int i=0 ; i<v.length ; i++){
    		for (int j=v.length ; j>i ; i--){
    		if(v[i]==v[j] && c>0){
    			st= st+v[j];
    			c++;}
    		if(v[i]==v[j] && c==0){
    			st= v[i]+v[j];
    			c++;}
    		}
    		if(st==0){
    		v[i]=w[pos];
    		pos++;}
    		if(st>0){
    		st=w[pos];
    		pos++;}
    		c=0;
    		st=0;
    	}
    	ridimensiona(w , pos);
    	return w;	
    	}
    	
    	public static void main (String[]args) {
    	int[] v ={7, 3, 3, 4, 1, 6, 6, 6, 7};
    	stampa (compattaRepliche(v));
    	}
    	
    	public static void stampa (int[]v) {
    	System.out.println("STAMPO IL NUOVO VETTORE:");
    	for (int i=0; i<v.length; i++)
    		System.out.print(v[i]+" ");
    	}
    	
    	public static int[] ridimensiona (int[] v, int val) {
    	int[] nuovoV= new int[val];
    	for (int i=0; i<val ; i++)
    	{
    		nuovoV[i]= v[i];
    	}
    	return nuovoV;
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143

    Re: [Java] Aiuto vettori !!!

    Prima cosa: sai già di che errore si tratta e dove viene generato ...

    Originariamente inviato da Freddyaot
    codice:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
          at traccia1a.compattaRepliche(traccia1a.java:19)
          at traccia1a.main(traccia1a.java:41)
    Seconda cosa:
    un array di dimensione 8 avrà gli elementi elencati dal numero 0 al numero 7.

    codice:
    int []w = new int[v.length];
    quindi dichiari w un array di dimensione v.lenght. Il primo elemento sarà quello di indice 0, e l'ultimo sarà quello di indice v.lenght-1.

    codice:
    	...
    		for (int j=v.length ; j>i ; i--){
    		if(v[i]==v[j] && c>0){
    qui tu dichiari j=v.lenght , e vuoi accedere alla posizine j dell'array, che non esiste (perchè come ti ho detto arriva fino a v.lenght-1. A causa di ciò ArrayIndexOutOfBoundsException

    Ciao

  3. #3

    Re: Re: [Java] Aiuto vettori !!!

    Ora va soltanto che mi stampa un vettore di dimenzione 9 come il vettore v con tutti i valori 0 mentre mi doveva stampare il vettore che mi aveva creato...saranno errate le funzioni e stampa e le funzioni ridimensiona ?

    codice:
    public class traccia1a{
    	public static int[] compattaRepliche(int[]v) {
    	int []w = new int[v.length];
    	int c=0;
    	int st=0;
    	int pos=0;
    	for (int i=0 ; i<v.length ; i++){
    		c=0;
    		st=0;
    		for (int j=v.length-1 ; j>i ; j--){
    		if(v[i]==v[j] && c>0){
    			st= st+v[j];
    			c++;}
    		if(v[i]==v[j] && c==0){
    			st= v[i]+v[j];
    			c++;}
    		}
    		if(st==0){
    		v[i]=w[pos];
    		pos++;}
    		if(st>0){
    		st=st+w[pos];
    		pos++;}
    	}
    	ridimensiona(w , pos);
    	return w;	
    	}
    	
    	public static void main (String[]args) {
    	int[] v ={7, 3, 3, 4, 1, 6, 6, 6, 7};
    	stampa (compattaRepliche(v));
    	}
    	
    	public static void stampa (int[]v) {
    	System.out.println("STAMPO IL NUOVO VETTORE:");
    	for (int i=0; i<v.length; i++)
    		System.out.print(v[i]+" ");
    	}
    	
    	public static int[] ridimensiona (int[] v, int val) {
    	int[] nuovoV= new int[val];
    	for (int i=0; i<val ; i++)
    	{
    		nuovoV[i]= v[i];
    	}
    	return nuovoV;
    	}
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    Prima cosa: perchè fai tutto static?

    Seconda cosa: perchè nel metodo compattaRepliche cicli l'array al contrario?

  5. #5
    Originariamente inviato da alesdario
    Prima cosa: perchè fai tutto static?

    Seconda cosa: perchè nel metodo compattaRepliche cicli l'array al contrario?
    Diciamo che non conosco altri metodi diversi da static....il professore usa sempre static quindi lo uso anche io

    Il metodo compattaRepliche lo ciclo al contrario xkè se lo ciclassi da 0 a x mi andrebbe a somamre lo stesso valore di i invece io devo sommare i valori di i che sono uguali ad i ma in una posizione diversa...
    x esempio se in posizione i=0 c'è il numero 7 quando entra nel ciclo se il ciclo lo faccio partendo dalla posizione 0 mi riprenderebbe quel 7 e mi sommerebbe lo stesso elemento nella posizione i=0....almeno x come ci ho ragionato io, poi posso pure aver sbagliato.

  6. #6
    Cmq riguardandolo ho trovato un altro errore

    codice:
    st=st+w[pos];
    che ho sostituito con

    codice:
    w[pos]=st;
    Con questa modifica mi stampa giusti solo i primi 2 valori e il sesto valore cioè:

    codice:
    14 6 0 0 0 18 12 0 0
    La mia prima osservazione è il xkè mi da 0 come valore negli indici dove ha trovati numeri singoli che nn deve sommare ma che deve soltanto copiare visto il seguente codice:

    codice:
    ..
    		if(st==0){
    		v[i]=w[pos];
    ..
    La seconda osservazione è che il ragionamento del ciclo che ho fatto non va bene poichè se trova 3 numeri uguali come x esempio nel mio vettore ci sono 6, 6, 6 me li somma prima tutti e 3 e poi gli ultimi 2....a questo punto nn so come fare.....suggerimenti ?

    Terza osservazione, la funzione ridimensiona non funziona

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    Originariamente inviato da Freddyaot
    Diciamo che non conosco altri metodi diversi da static....il professore usa sempre static quindi lo uso anche io
    La programmazione ad oggetti è un mondo ben più ampio di "static" ... ti consiglio di studiartela per bene.

    Il metodo compattaRepliche lo ciclo al contrario xkè se lo ciclassi da 0 a x mi andrebbe a somamre lo stesso valore di i invece io devo sommare i valori di i che sono uguali ad i ma in una posizione diversa...
    Fare un controllo sull'indice del vettore? Scorrerlo all'indietro non mi sembra che possa risolvere il problema

    on questa modifica mi stampa giusti solo i primi 2 valori e il sesto valore cioè:
    Se la modifica è corretta deve stamparti correttamente tutto il vettore ... non solo una parte, evidentemente c'è qualcosa che non va in tutto il codice ...

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    comunque: potresti provare a fare così. La butto li come idea, ad implementarla devi pensarci tu

    Considera il tuo vettore che ricevi in ingresso. Ne fai una copia.

    Per ogni valore del primo cicli il secondo controllando le repliche, sommandole e sostituendole.

    Quando sostituisci un numero lo salvi in un vettore, in modo da poter controllare quali hai già sostituito.

    Un altro consiglio: i nomi delle variabili .... "v" , "w", "c", "st" ... non vanno bene. I nomi delle variabili devono essere il più possibili coerenti all'utilizzo che ne viene fatto,

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 © 2026 vBulletin Solutions, Inc. All rights reserved.