Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Alex_47 on 26-01-2009, 18:14:55



Title: Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 26-01-2009, 18:14:55
Qualcuno ha mai provato a fare la terza fase degli esercizi sull'UML??

Questi esercizi sono tutti con l'ordinamento e come se non bastasse bisogna ordinare tutto ciò in un array indipendente senza clonare gli oggetti  , qualcuno per caso è riuscito a farli?

vi prego rispondete!!!    .smile


Title: Re:Ordinamento di un array di oggetti i un altro array indipendenti
Post by: Aigor on 26-01-2009, 18:23:43
Questa parte si basa sugli algoritmi di ordinamento studiati. Se non ne viene richiesto uno in particolare ti consiglio di utilizzare il bubblesort, gli altri che potrebbero essere richiesti sono il selectionsort e l'insertionsort ! Dovresti trovare tutto nel moduloC comunque.


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 26-01-2009, 18:26:25
Si! l'unico problema che ho provato a farne uno ma mi chiedo come si possa fare se gli oggetti non vengono clonati!

MI servirebbe sentire il parere di qualcuno che è riuscito a farli , dato che bisogna salvare i dati in un array indipendente di oggetti , il che è un casino!


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 26-01-2009, 18:45:04
Comunque per provare a capirlo meglio sto partendo da una esercizio tipo selection sort in cui prendendo un array di interi li salva ordinandoli un un altro array indipdente , ma l'ordinamente avviene in maniera errata..

Code:
import java.io.*;
import java.lang.*;
import java.math.*;


public class valo
{
static void swap ( int a[],int b[] , int primo, int secondo )
    {
      int Q;
      int W;
     
      Q = a[primo];
      W = a[secondo];
     
      b[primo] = W;
      b[secondo] = Q;
     
      //tmp = a[primo];         
      //a[primo] = a[secondo]; 
      //a[secondo] = tmp;
    }


public static void main(String []args)
{
int [] A = {8, 4, 6, 1, 2, 7, 5, 3};

int [] B = new int[8];

int i,j;
int min;

   

for(j=0;j<A.length-1;j++)
{

min=j;

for(i=j+1;i<A.length;i++)
{
if( (A[i] < A[min]))
min=i;

swap(A,B,min,j);

}
}




for(i=0;i<B.length;i++)
{
System.out.println(B[i]);
}
}

}



e l'outpout mi viene..
1
1
1
1
2
3
3
5



Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Aigor on 26-01-2009, 18:52:12

Scusa ma non vedo il problema >_> ....
Ammettiamo che tu abbia il tuo bell'array di oggetti nel tuo main, lo passi al metodo bubblesort ...

Code:

public void bubbleSort(BaseObject[] data){
int i,j;
for (i = 0; i < data.length-1; i++)
for (j = data.length-1; j > i; --j)
if (data[j].isLessThan(data[j-1]))
swap(data,j,j-1);
}

void swap(BaseObject []a, int e1, int e2) {
BaseObject tmp = a[e1];
a[e1] = a[e2];
a[e2] = tmp;
}

...e come per magia l'array è ordinato >_> .... Non stiamo clonando gli oggetti nè tanto meno ne stiamo inventando di nuovi


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Aigor on 26-01-2009, 18:55:45
Comunque per provare a capirlo meglio sto partendo da una esercizio tipo selection sort in cui prendendo un array di interi li salva ordinandoli un un altro array indipdente , ma l'ordinamente avviene in maniera errata..

Code:
import java.io.*;
import java.lang.*;
import java.math.*;


public class valo
{
static void swap ( int a[],int b[] , int primo, int secondo )
    {
      int Q;
      int W;
     
      Q = a[primo];
      W = a[secondo];
     
      b[primo] = W;
      b[secondo] = Q;
     
      //tmp = a[primo];         
      //a[primo] = a[secondo]; 
      //a[secondo] = tmp;
    }


public static void main(String []args)
{
int [] A = {8, 4, 6, 1, 2, 7, 5, 3};

int [] B = new int[8];

int i,j;
int min;

   

for(j=0;j<A.length-1;j++)
{

min=j;

for(i=j+1;i<A.length;i++)
{
if( (A[i] < A[min]))
min=i;

swap(A,B,min,j);

}
}




for(i=0;i<B.length;i++)
{
System.out.println(B[i]);
}
}

}



e l'outpout mi viene..
1
1
1
1
2
3
3
5



Prima di fare lo swap devi controllare che min != i !!!!


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: TheSpecialOne on 26-01-2009, 19:00:40
se vi puo aiutare, metto una mia "versione" di bubblesort!
Se ci sono errori correggete pure!!

Code:

int dim=vettore.length-1;
prodotti temp;
for (int i=0;i<vettore.length-1;i++)
{
     dim--;
     for (int j=0;j<dim;j++)
     {
           int k=j+1;
           if (vettore[j].getCosto()>vettore[k].getCosto())         //getCosto() metodo preso per esempio
           {
               temp=vettore[j];
               vettore[j]=vettore[k];
               vettore[k]=temp;
           }
      }
}

for (int i=0;i<vettore.length-1;i++)
{
      System.out.println (vettore[i]);
}


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 26-01-2009, 19:06:40
Il tuo esempio è buono! Ma i dati dell'array devono essere ordinati un array indipendente , il che è ancora più difficile , io ci ho provato a farlo partendo da un array di interi , ma non risulta , per caso il prof mercoledi a che orario fa ricevimento?


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: TheSpecialOne on 26-01-2009, 19:10:17
Il tuo esempio è buono! Ma i dati dell'array devono essere ordinati un array indipendente , il che è ancora più difficile , io ci ho provato a farlo partendo da un array di interi , ma non risulta , per caso il prof mercoledi a che orario fa ricevimento?

non sò sinceramente il ricevimento del prof...nel frattempo se qualcuno ha altre soluzioni, fatevi sotto!  :boh


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 26-01-2009, 19:13:18
Io comunque ho fatto una soluzione del genere ma che però non va , prendendo un array di oggetti e ordinandolo in un altro array indipendente di oggetti

Code:

prodotti [] X = new prodotti[30];
prodotto Q;
prodotto W;

for(int j=1;j<P.length;j++)
{
    
    for(i=0;i<P.length;i++)
    {
         if(P[i].getPrezzo()>P[i+1].getPrezzo])
         {

         Q=P[i];
         W=P[i+1];
         X[i]=W;
         X[i+1]=Q;
     }
}



Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 26-01-2009, 19:28:10
questo è invece l'esercizio prendendo l'array e salvandolo in un array indipendente ordinato , ma non riesco a capire il perchè non me lo ordina!!

Code:
import java.io.*;
import java.lang.*;
import java.math.*;


public class valo
{

public static void main (String []args)
{

int [] A = {8, 4, 6, 1, 2, 7, 5, 3};

int [] B = new int[8];

        int Q;
        int W;
     
int i,j;

for ( j = 1; j < A.length; j++ )
{
for ( i = 0; i < A.length-1;i++ )
{
if ( A[i] > A[i+1] )
{


Q=A[i];
B[i]=A[i+1];
B[i+1]=Q;


}   
       
               
            }
    }




for(i=0;i<B.length;i++)
{
System.out.println(B[i]);
}




}

}



Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Aigor on 27-01-2009, 00:54:57
Ecco qua i tre metodi di ordinamento, funzionanti e testati !! Spero vi possano essere d'aiuto per l'esame !!!

Code:

public class ordinamento
{

public static void main (String []args)
{

int [] A = {8, 4, 6, 1, 2, 7, 5, 3};
int [] B = {2,6,4,10,12,8};
        int [] C = {9,18,21,3,6,12};
       
        System.out.println("Bubble Sort:");
        bubbleSort(A);
        print(A);
        System.out.println("\n\nSelection Sort:");
        selectionSort(B);
        print(B);
        System.out.println("\n\nInserection Sort");
        inserectionSort(C);
        print(C);
       
       

    }
    //Semplice metodo di stampa
    public static void print(int[]A){
       
        for(int i=0;i<A.length;i++)
            System.out.print(A[i]+" ");
    }
    //Ordinamento a bolle
    public static void bubbleSort(int[] data){
        int i,j;
        for (i = 0; i < data.length-1; i++)
            for (j = data.length-1; j > i; --j)
                if (data[j]<data[j-1])
                    swap(data,j,j-1);
    }
    //Ordinamento per selezione
    public static void selectionSort(int[] data) {
        int i,j,least;
        for (i = 0; i < data.length-1; i++)
        {
            for (j=i+1, least=i; j<data.length; j++)
                if (data[j]<data[least])
                    least = j;
            if (least != i)
                 swap(data,least,i);
        }

    }
    //Ordinamento per inserimento
    public static void inserectionSort(int[] data) {
        int tmp,i, j;
        for (i = 1; i < data.length; i++)
        {
            tmp = data[i];
            for (j=i; j>0 && tmp<data[j-1]; j--)
                data[j] = data[j-1];
            data[j] = tmp;
        }
    }
   
    //Scambio !
    public static void swap(int[]a, int e1, int e2) {
        int tmp = a[e1];
        a[e1] = a[e2];
        a[e2] = tmp;
    }

}




Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Vivynz on 27-01-2009, 10:24:04
Come ti ho già detto non c'è niente di difficile...basta copiare tutti gli elementi dell'array in un altro array(essendo degli oggetti e non dei tipi primitivi non vengono clonati ma viene copiato solamente il riferimento,cioè si avranno due riferimenti,quello del vecchio array e quello dell'array indipendente,che puntano allo stesso oggetto) e poi fare l'ordinamento dell'array appena creato, con uno dei tre algoritmi che abbiamo studiato(bubblesort,insertionsort,selectionsort) .camberman


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Fr3d3R!K on 27-01-2009, 10:45:02
chiariamo una cosa (aaah cosa fa fare studiare il C++ ed i puntatori che quel gran "vigliaccone" di java invece ci nasconde >:) ): clonare un oggetto significa crearne un altro dal nulla esattamente identico a quello che abbiamo che però risulta essere un altro array a tutti gli effetti (come qualsiasi altro tipo di clonazione in quanto ho ripreso il significato del termine). Quando dichiariamo un vettore con la classica sintassi java
Code:
int[] vettore;
non viene allocato il vettore vero e proprio ma una variabile contenente l'indirizzo di memoria dell'array (che quindi punta al vero e proprio array). Il nostro array quindi conterrà i puntatori (variabili che infatti puntano alla locazione di memoria dove sta l'oggetto) degli oggetti. A questo punto se io, avendo due vettori A e B scrivessi l'istruzione
Code:
B[0]=A[0]
questa copierebbe semplicemente il riferimento all'oggetto della 0sima posizione di A all'interno della posizione 0sima di B, l'oggetto che sta nella posizione 0 di A non viene toccato, nè copiato. Per clonare un oggetto si usa questo (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#clone()) metodo, con un buon esempio rintracciabile in questo (http://geekswithblogs.net/dforhan/archive/2005/12/01/61852.aspx) blog.
Saluti! .ciaociao
EDIT: Ouch mi ha anticipato Vivynz (e sembra di parecchio :[Emoticon] Asd: ). Vabbè meglio due spiegazioni che una .whistling .wink


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Vivynz on 27-01-2009, 11:02:42
EDIT: Ouch mi ha anticipato Vivynz (e sembra di parecchio :[Emoticon] Asd: ). Vabbè meglio due spiegazioni che una .whistling .wink
ahaha non fa niente però il fatto che la spiegazione coincide mi fa piacere significa che qualcosa la sto imparando  :yoh


Title: Re:Ordinamento di un array di oggetti in un altro array indipendente
Post by: Alex_47 on 27-01-2009, 12:03:18
Grazie ragazzi , pensavo che clonare un oggetto significasse copiare il riferimento!
Cmq ora ho capito tutto^^ XD