Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-07-2012, 14:47   #1
zanardi84
Senior Member
 
L'Avatar di zanardi84
 
Iscritto dal: Apr 2004
Città: La regione del Triplete
Messaggi: 5749
[JAVA] merge sort: il codice è corretto (compilato senza errori)?

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.

Codice:
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++;
		}
	}
}
__________________
Trattative felicemente concluse con domienico120, xbax88 ed engiel, ottimi e seri utenti.
zanardi84 è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2012, 17:20   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da zanardi84 Guarda i messaggi
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.

Codice:
public class DivideEtImpera <T extends Comparable<? super T>> 
{ ...snip }
Ciao, risposta breve:
1) se si può, è meglio usare le collection con i generics, non gli array.
2) se si deve usare gli arrays una soluzione è passare la Class per conservare l'informazione sul tipo a runtime e usarla con il metodo java.util.Arrays.newInstance per costruire array generici. Leggi qui: How do I generically create objects and arrays?
Altro link da leggere: Java how to: Generic Array creation (on StackOverflow)

Poi circa la tua domanda sulla type safety nel tuo caso: possiamo fare un ragionamento di massima.
Visto che la classe DivideEtImpera per essere istanzia richiede un array generico il cui tipo parametrico sia un <T extends Comparable<? super Comparable>> hai la garanzia che due elementi di detto array siano confrontabili tra di loro (nel contesto di merge), poco importa che poi, internamente alla classe, tu in realtà crei e manipoli dei sotto-array di tipo Comparable, fintanto che gli elementi che ci infili dentro sono le istanze che hai ricevuto in fase di costruzione (ovvero istanze che in effetti sono compatibili con <T extends Comparable<? super Comparable>>).

La faccenda sarebbe diversa se tu, invece di limitarti a creare dei nuovi riferimenti ad array in cui infili elementi rcevuti da chi ha istanziato la classe, che so, creassi ex-novo degli elementi di tipo compatibile con Comparable ma non compatibile con <T extends Comparable<? super Comparable>>.

Chiaro no?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 16-07-2012 alle 17:23.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
MacBook Neo sorprende iFixit: 'Non vedev...
Venus Optics presenta due nuovi obiettiv...
AMD pubblica una guida per eseguire Open...
Tomb Raider I-III Remastered arriva su A...
X fa marcia indietro: si adeguerà...
Framework e la crisi delle memorie: terz...
Doom è ovunque: perché il ...
NVIDIA aggiorna G-Sync Pulsar: migliorat...
Portatile gaming con RTX 5060 a 1.099€: ...
6G for dummies: al MWC 2026 il CEO di Qu...
Le RAM tornano a salire di prezzo: quest...
5 robot aspirapolvere bestseller al mini...
A 59 anni il mio primo hackathon: dieci ...
Come sfruttare le Offerte di Primavera p...
NVIDIA promette un salto enorme: path tr...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v