Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Fusione Array [Java]

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    23

    Fusione Array [Java]

    Dovevo risolvere un problema di fusione di due array.
    Il metodo credo sia giusto, ma ricevo un errore in console

    codice:
    public class FusioneArray
    {
    	static void fondi(int[] uno, int[] due, int[] ris)
    	{
    		int indUno = 0;
    		int indDue = 0;
    		int indRis = 0;
    		boolean prendiUno;
    		
    		do
    		{
    			if (indUno == uno.length)
    				prendiUno = false;
    			else if (indDue == due.length) 
    				prendiUno = true;
    			else
    			{
    				if (uno[indUno] <= due[indDue])
    					prendiUno = true;
    				else
    					prendiUno = false;
    			}
    			if (prendiUno == true)
    			{
    				ris[indRis] = uno[indUno];
    				indUno++;
    			}
    			else
    			{
    				ris[indRis] = due[indDue];
    				indDue++;
    			}
    			indRis++;
    		}while(indRis < ris.length);
    	}
    		
    	
    	public static void main(String[]args)
    	{
    		int[] primo = {3,4,21,45,67,89,98,123};
    		int[] sec = {0,3,13,34,56,234};
    		int[] fusione = new int[primo.length * sec.length];
    		
    		fondi(primo, sec, fusione);
    		for (int i = 0; i < fusione.length; i++)
    			System.out.print(fusione[i] + "\t");
    	}
    }

    Ricevo il seguente errore...

    C:\WINDOWS\SYSTEM32>java FusioneArray
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
    at FusioneArray.fondi(FusioneArray.java:30)
    at FusioneArray.main(FusioneArray.java:44)

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    23

    Re: Fusione Array [Java]

    Mi rispondo da solo

    Originariamente inviato da Zitrog
    codice:
    	public static void main(String[]args)
    	{
    		int[] primo = {3,4,21,45,67,89,98,123};
    		int[] sec = {0,3,13,34,56,234};
    		int[] fusione = new int[primo.length * sec.length];
    		
    		fondi(primo, sec, fusione);
    		for (int i = 0; i < fusione.length; i++)
    			System.out.print(fusione[i] + "\t");
    	}
    }
    L'errore era in quella linea... mi è scappato un * anzichè un +

    ...basta x oggi è meglio andare a dormire

  3. #3
    Concettualmente quel codice e` un po` "sporco". Se passi un array piu` grande del necessario il programma non funziona! Non ha molto senso..

    Piuttosto - accusando la limitatezza di Java in questo caso - l`array fusione lo allocherei dentro la funzione e lo restituirei come risultato. Ti indico il prototipo, rifalla cosi`:

    codice:
    static int[] fondi( int[] uno, int[] due )
    E in main() la utilizzerai cosi`:

    codice:
    public static void main(String[]args)
    {
    	int[] primo = {3,4,21,45,67,89,98,123};
    	int[] sec = {0,3,13,34,56,234};
    	int[] fusione = fondi(primo, sec);
    
    	for (int i = 0; i < fusione.length; i++)
    		System.out.print(fusione[i] + "\t");
    }
    Cosi` l`utente non dovra` preoccuparsi assolutamente dell`allocazione e non ti ritroverai a combattere con l`errore di prima.

    Ciao.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    23
    Non ho capito una cosa, in che senso "se passi un array più grande del necessario"?


    Io quando richiamo il metodo dalla main() gli passo l'array fusione che ha dimensione pari alla somma degli altri due...quindi non dovrebbe mai essere più grande del necessario

  5. #5
    Cio` che provocava quell`eccezione era questa riga, come tu hai notato:

    codice:
    int[] fusione = new int[primo.length * sec.length];
    E questo perche` primo.length * sec.length > primo.length + sec.length, nel caso specifico. Quindi se lasci il codice cosi` com`e`, ogni volta devi preoccuparti che usando quella funzione devi allocare _esattamente_ una certa quantita` di memoria. Se si arriva a dare una quantita` non esatta (ad es. per una piccola imprecisione di un`altra funzione esterna), potresti trovarti a debuggare ore e ore per una cretinata. Capito cosa intendo?

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