zanardi84
16-07-2012, 14:47
Premesso che viene compilato correttamente e che esegue l'ordine (provato con gli Integer sfruttando l'autoboxing), dichiarare come Comparable gli array temporanei è corretto o c'è una scelta migliore per il metodo generico? Cioè, non capisco se dichiararli Comparable garantisca quanto ho scritto nella firma dichiarazione della classe.
public class DivideEtImpera <T extends Comparable<? super T>>
{
private Comparable a[];
// costruttore
public DivideEtImpera(T array[])
{
a = array;
}
public void sort()
{
if(a.length <=1)
return;
Comparable primo[] = new Comparable[a.length/2];
Comparable secondo[] = new Comparable[a.length - primo.length];
// riempio i due array
for(int i = 0; i<primo.length; i++)
{
primo[i] = a[i];
}
for(int i = 0; i<secondo.length; i++)
{
secondo[i] = a[primo.length+i];
}
DivideEtImpera <T> dividePrimo = new DivideEtImpera(primo);
DivideEtImpera<T> divideSecondo = new DivideEtImpera(secondo);
dividePrimo.sort();
divideSecondo.sort();
// metto assieme in un nuovo array, ordinando.
merge(primo, secondo);
}
private void merge(Comparable primo[], Comparable secondo[])
{
int iPrimo = 0;
int iSecondo = 0;
int i = 0;
while(iPrimo < primo.length && iSecondo < secondo.length)
{
if(primo[iPrimo].compareTo(secondo[iSecondo])<0)
{
a[i] = primo[iPrimo];
iPrimo++;
}
else
{
a[i] = secondo[iSecondo];
iSecondo++;
}
i++;
}
// completo il riempimento degli array.
while(iPrimo < primo.length)
{
a[i] = primo[iPrimo];
iPrimo++;
i++;
}
while(iSecondo < secondo.length)
{
a[i] = secondo[iSecondo];
iSecondo++;
i++;
}
}
}
public class DivideEtImpera <T extends Comparable<? super T>>
{
private Comparable a[];
// costruttore
public DivideEtImpera(T array[])
{
a = array;
}
public void sort()
{
if(a.length <=1)
return;
Comparable primo[] = new Comparable[a.length/2];
Comparable secondo[] = new Comparable[a.length - primo.length];
// riempio i due array
for(int i = 0; i<primo.length; i++)
{
primo[i] = a[i];
}
for(int i = 0; i<secondo.length; i++)
{
secondo[i] = a[primo.length+i];
}
DivideEtImpera <T> dividePrimo = new DivideEtImpera(primo);
DivideEtImpera<T> divideSecondo = new DivideEtImpera(secondo);
dividePrimo.sort();
divideSecondo.sort();
// metto assieme in un nuovo array, ordinando.
merge(primo, secondo);
}
private void merge(Comparable primo[], Comparable secondo[])
{
int iPrimo = 0;
int iSecondo = 0;
int i = 0;
while(iPrimo < primo.length && iSecondo < secondo.length)
{
if(primo[iPrimo].compareTo(secondo[iSecondo])<0)
{
a[i] = primo[iPrimo];
iPrimo++;
}
else
{
a[i] = secondo[iSecondo];
iSecondo++;
}
i++;
}
// completo il riempimento degli array.
while(iPrimo < primo.length)
{
a[i] = primo[iPrimo];
iPrimo++;
i++;
}
while(iSecondo < secondo.length)
{
a[i] = secondo[iSecondo];
iSecondo++;
i++;
}
}
}