Problema con esercizio sugli array

di il
4 risposte

Problema con esercizio sugli array

Salve sono nuovo in questo sito quindi non so bene come funzioni, è il mio primo argomento questo...
Sto seguendo un corso online di Java e nella penultima sezione ci sono vari esercizi spiegati dall'insegnante.
Io prima di vedere il video spiegazione però ci provavo da solo a svolgerlo e poi dopo averlo svolto guardavo la sua soluzione per vedere come lo aveva fatto lui.

Mi sono imbattuto in questo esercizio dove bisogna creare un metodo che da un array di interi ne crei uno nuovo dove i numeri pari sono tutti a sinistra e i dispari a destra non cambiando l'ordine.

Esempio
Array: {2,5,7,6,4,8}
Nuovo array: {2,6,4,8,5,7}

Questo è il mio programma:

**************************************************************************************
main:
package CorsoJava.Esercizio_6;

/*Implementare un metodo public static int[] split(int[] unArray){...} che restituisce 
 * un array ottenuto spostando a sinistra tutti i numeri pari presenti in unArray e 
 * spostando a destra tutti quelli dispari, mantenendo l'ordine relativo degli elementi.
 * */

public class Es06 {

	public static void main(String[] args) {
		
		//Istanza della classe
		Split split = new Split();
		
		//dichiarazione variabili
		int[] array = {2,5,456,673,713,23,3};
		int length = array.length;
		
		//Stampa dell'array
		System.out.print("\nArray: {");
		
		for(int k=0;k<length;k++) {
			System.out.print(array[k]+",");
		}
		System.out.println("}\n\n");
		
		//Uso del metodo split della classe 
		split.split(array);
	}

}
****************************************************************************************
Classe:

package CorsoJava.Esercizio_6;

public class Split {
	
	public void split(int[] unArray) {
		//Dichiarazioni variabili
		int counterPari=0;
		int[] pari= new int[counterPari+2];
		int counterDispari=0;
		int[] dispari= new int[counterDispari+2];
		int length1 = unArray.length;
		int[] finale = new int[length1];
		
		//ciclo for per smistare numerio pari nell'array pari e numeri dispari nell'array dispari
		for(int i=0;i<length1;i++) {
			if(unArray[i]%2==0) {
				pari[counterPari]=unArray[i];
				counterPari++;
			}else {
				dispari[counterPari]=unArray[i];
				counterDispari++;
			}	
		}
		
		//ciclo for di controllo che stampa i due array
		for(int el : pari) {
			System.out.print(el+",");
		}
		
		System.out.println("");
		
		for(int er : dispari) {
			System.out.print(er+",");
		}
		
		//ciclo for per unione dei due array
		for(int j=0;j<length1;j++) {
			if(j<counterPari) {
				finale[j]=pari[j];
			}else {
				finale[j]=dispari[j];
			}
		}
		
		//Stampa finale
		System.out.print("\nNuovo array: {");
		for(int k=0;k<length1;k++) {
			System.out.print(finale[k]+",");
		}
		System.out.print("}");
	}

}
Io rivedendolo e provando a modificare il programma non sono riuscito a capire il problema

L'errore si riscontra nel ciclo for per smistare i numeri nei vari array pari e dispari.
Si riscontra nel ciclo for per l'unione degli array se per esempio l'array comincia per numero dispari.

Una mia supposizione era che il problema fosse causato dall'incremento dei counter ma non ne capisco il motivo visto che ho utilizzato in altri esercizi lo stesso metodo di soluzione.

4 Risposte

  • Re: Problema con esercizio sugli array

    Lollox48 ha scritto:


    
    public class Split {
    	
    	public void split(int[] unArray) {
    		//Dichiarazioni variabili
    		int counterPari=0;
    		int[] pari= new int[counterPari+2];
    		int counterDispari=0;
    		int[] dispari= new int[counterDispari+2];
    		int length1 = unArray.length;
    		int[] finale = new int[length1];
    		
    		//ciclo for per smistare numerio pari nell'array pari e numeri dispari nell'array dispari
    		for(int i=0;i<length1;i++) {
    			if(unArray[i]%2==0) {
    				pari[counterPari]=unArray[i];
    				counterPari++;
    			}else {
    				dispari[counterPari]=unArray[i];
    				counterDispari++;
    			}	
    		}
    		
    		//ciclo for di controllo che stampa i due array
    		for(int el : pari) {
    			System.out.print(el+",");
    		}
    		
    		System.out.println("");
    		
    		for(int er : dispari) {
    			System.out.print(er+",");
    		}
    		
    		//ciclo for per unione dei due array
    		for(int j=0;j<length1;j++) {
    			if(j<counterPari) {
    				finale[j]=pari[j];
    			}else {
    				finale[j]=dispari[j];
    			}
    		}
    		
    		//Stampa finale
    		System.out.print("\nNuovo array: {");
    		for(int k=0;k<length1;k++) {
    			System.out.print(finale[k]+",");
    		}
    		System.out.print("}");
    	}
    
    }
    
    Già solo qui stai facendo 5 volte di più di quello che servirebbe. Non servono nemmeno i 2 array temporanei. Basta un solo array finale, l'approccio più semplice è quello di fare 2 cicli for, uno per depositare prima quelli pari, il secondo per quelli dispari.

    Fai un metodo es.

    public static int[] primaPariPoiDispari(int[] array)

    Abituati a non mescolare le cose, in un metodo come questo non dovresti stampare/chiedere nulla all'utente. Solo la logica. Poi stampe o quant'altro nel main.
  • Re: Problema con esercizio sugli array

    Se per array temporanei intende i due array che ho chiamato "di controllo" non dovrebbero esserci li. Li ho creati per capire che problema ci fosse.
    Quindi il ciclo finale di stampa lo dovrei spostare nel main e modificare i due cicli for per depositare i numeri?
  • Re: Problema con esercizio sugli array

    Lollox48 ha scritto:


    Se per array temporanei intende i due array che ho chiamato "di controllo" non dovrebbero esserci li.
    int[] pari e int[] dispari NON servono. Oltre al fatto che sono gestiti "male" (e non ti funziona nulla).

    int counterPari=0;
    int[] pari= new int[counterPari+2];

    Quanto vale counterPari? zero. Quindi pari è un array creato di 2 elementi. Non importa se poi successivamente incrementi counterPari!! L'array l'hai già istanziato. Idem per counterDispari.

    Lollox48 ha scritto:


    Quindi il ciclo finale di stampa lo dovrei spostare nel main e modificare i due cicli for per depositare i numeri?
  • Re: Problema con esercizio sugli array

    Ho capito grazie non sapevo del fatto che istanziare un array ne privasse la modifica dopo. Proverò poi le modifiche
Devi accedere o registrarti per scrivere nel forum
4 risposte