PDA

View Full Version : [Java] confronto sorgenti


AngeL)
26-08-2007, 20:17
vorrei provare a confrontare i nostri stili di scrittura del codice :D
non solo l'indentazione, anche (ad esempio) l'uso di break e continue, l'uso di classi anonime e così via...
per questo serve un qualcosa da scrivere... io avevo pensato ad un hash o ad una queue... void cosa ne pensate? :D

andbin
26-08-2007, 20:26
vorrei provare a confrontare i nostri stili di scrittura del codice :D
non solo l'indentazione, anche (ad esempio) l'uso di break e continue, l'uso di classi anonime e così via...
per questo serve un qualcosa da scrivere... io avevo pensato ad un hash o ad una queue... void cosa ne pensate? :DNon ho ben capito cosa (e sopratutto come) vorresti confrontare. :stordita:
E non ho capito cosa c'entra un hash con lo stile di scrittura. :stordita: :stordita:

AngeL)
26-08-2007, 20:27
Non ho ben capito cosa (e sopratutto come) vorresti confrontare. :stordita:
E non ho capito cosa c'entra un hash con lo stile di scrittura. :stordita: :stordita:

praticamente ognuno scrive una classe per implementare (es.) un hash, e poi vediamo chi ha sbagliato qualcosa, chi poteva fare meglio...
una specie di scambio culturale :D

andbin
26-08-2007, 20:41
praticamente ognuno scrive una classe per implementare (es.) un hash, e poi vediamo chi ha sbagliato qualcosa, chi poteva fare meglio...
una specie di scambio culturale :DAh ok ... in quel senso :D :doh: Si stabilisce un argomento/problema preciso e si vede come ognuno ha scritto il sorgente. Il problema è solo la scelta di cosa fare ....

AngeL)
26-08-2007, 21:17
Ah ok ... in quel senso :D :doh: Si stabilisce un argomento/problema preciso e si vede come ognuno ha scritto il sorgente. Il problema è solo la scelta di cosa fare ....

esatto :D

Il problema è solo la scelta di cosa fare ....
appunto.. tu cosa proponi? :p

PGI-Bis
26-08-2007, 22:48
L'ultima volta che ho usato continue è stato nella primavera del '24.

AngeL)
26-08-2007, 22:59
L'ultima volta che ho usato continue è stato nella primavera del '24.

:asd: e perchè?

PGI-Bis
26-08-2007, 23:09
Credo per un errore di gioventù :D

AngeL)
26-08-2007, 23:15
Credo per un errore di gioventù :D
neanche io li uso tanto... non mi è mai capitato che mi servissero :D

comunque vogliamo provare questo scambio :ciapet:turale? :D

cionci
26-08-2007, 23:17
Credo per un errore di gioventù :D
Grande !! :D

Bellina come idea...bisognerebbe stabilire bene il testo dell'esercizio da svolgere in modo che il codice sia simili per tutti...

AngeL)
26-08-2007, 23:26
Grande !! :D

Bellina come idea...bisognerebbe stabilire bene il testo dell'esercizio da svolgere in modo che il codice sia simili per tutti...

potremmo provare con un programming exam di java black belt... io uno l'ho già fatto :O

PGI-Bis
26-08-2007, 23:27
O' signur. Ve lo do io qualcosa da fare. Devo fare l'interfaccia per un record che avrà trenta milioni di campi. Mi ci vuole uno schermo a 640x20218 perchè si veda tutta. Requisiti utente: deve avere quattro cervelli per riuscire a restare attento mentre immette tutti i dati che servono.

AngeL)
26-08-2007, 23:30
O' signur. Ve lo do io qualcosa da fare. Devo fare l'interfaccia per un record che avrà trenta milioni di campi. Mi ci vuole uno schermo a 640x20218 perchè si veda tutta. Requisiti utente: deve avere quattro cervelli per riuscire a restare attento mentre immette tutti i dati che servono.

O__o programmatore masochista :asd:

edit: servirà anche un HD da 20 TB :asd:

AngeL)
27-08-2007, 09:06
allora, proviamo? :D
da dove lo pigliamo st'esercizio? :wtf:

edit: e se provassimo a fare tutti insieme (yuppiii) un progetto in swing?

andbin
27-08-2007, 12:12
tu cosa proponi? :pBeh, di possibilità ce ne sono infinite. Alcune che mi vengono in mente:

- Realizzare un programma (console o gui) che data una directory in input, faccia una statistica di tutto il sotto albero di directory: numero di file, totale dimensione dei file, ecc....

- Realizzare un programma gui che consenta di fare conversioni tra unità di misura (quali unità, lo si stabilisce a priori).

- Realizzare un programma gui che permetta di scegliere un file e quindi computare diversi hash sul file es. MD5, SHA-1 (se non sbaglio ci sono già, almeno nelle ultime release di Java, dei provider appositi per questi digest).

- Realizzare un programma gui per il famoso gioco dei "15", fatto con i numeri o anche con immagini.

- Realizzare un programma per gestire una semplice chat di tipo client-server. Un server riceve i messaggi da un client e li "gira" verso tutti gli altri client. Questo già presuppone un discreta conoscenza del networking.

cionci
27-08-2007, 12:16
Se si fa senza gui è possibile confrontare diversi linguaggi ;)
Io sinceramente pensavo a qualcosa di più breve...

PGI-Bis
27-08-2007, 12:36
I GUI framework sono più omogenei di quanto non si possa sospettare. Comunque, riciclo un'idea. Riconoscimento ottico di un'informazione contenuta in un'immagine a colori.

Cioè impacchettare informazioni in un'immagine e leggere le stesse informazioni da una scansione di quell'immagine (ad esempio l'immagine da "leggere" potrebbe essere la fotografia del display di un cellulare).

cionci
27-08-2007, 12:41
Cioè impacchettare informazioni in un'immagine e leggere le stesse informazioni da una scansione di quell'immagine (ad esempio l'immagine da "leggere" potrebbe essere la fotografia del display di un cellulare).
Ma sono cose lunghe (che tra l'altro ho già fatto). Io credevo che AngeL) si riferisse di più allo stile di scrittura del codice e non alla bravura nell'implementare un certo esercizio.

AngeL)
27-08-2007, 12:57
Ma sono cose lunghe (che tra l'altro ho già fatto). Io credevo che AngeL) si riferisse di più allo stile di scrittura del codice e non alla bravura nell'implementare un certo esercizio.

boh.. io volevo semplicemente confrontare 4-5 codici per vedere un po' in generale lo stile di ognuno :D

ah, visto che non avevo niente da fare, ho fatto l'hash :O
perchè non iniziamo con questo, che è piu' veloce da fare? :D

questo è il mio :D
public class Hash<K, V> {

private static int DEFAULT_MAX_ELEMS = 100;

static public class KeyAlreadyExistsException extends RuntimeException {
KeyAlreadyExistsException(String key) {
super("Key already exists in the hash : " + key);
}
}

static public class KeyNotFoundException extends RuntimeException {
KeyNotFoundException(String key) {
super("Can't find key : " + key);
}
}

static public class HashIsFullException extends RuntimeException {
HashIsFullException() {
super("The hash is full");
}
}

protected int MAX_ELEMS;
protected Object[] values;
protected Object[] keys;
protected int elemcount;

/**
* Instantiates a new Hash.
* @param MAX_ELEMS The maximum number of elements this hash can hold.
*/
public Hash(int MAX_ELEMS) {
elemcount = 0;
this.MAX_ELEMS = MAX_ELEMS;
values = new Object[MAX_ELEMS];
keys = new Object[MAX_ELEMS];
}

public Hash() {
this(DEFAULT_MAX_ELEMS);
}

/**
* Looks for an object in the hash.
* @param key The key associated to the value to find
* @throws KeyNotFoundException
* @return The object associated with key*/
public V find(K key)
throws KeyNotFoundException {
return (V)values[indexOfKey(key)];
}

/**
* Adds a value to the hash.
* @param key The key representing the value to add
* @param value The value to add to the hash
* @throws KeyAlreadyExistsException
* @throws HashIsFullException*/
public void add(K key, V value)
throws HashIsFullException, KeyAlreadyExistsException {
if(keyAlreadyExists(key)) throw new KeyAlreadyExistsException(key.toString());
int nextFree = nextFreeIndex();

keys[nextFree] = key;
values[nextFree] = value;
elemcount++;
}

/**
* Removes a value from the hash and returns it.
* @param key The key representing the value to remove
* @throws KeyNotFoundException
* @return The value or null if the key isn't associated to a value*/
public V remove(K key)
throws KeyNotFoundException {
int i = indexOfKey(key);
V ret;
elemcount--;
keys[i] = null;
ret = (V)values[i];
values[i] = null;
return ret;
}

/**
* Replaces a key with another one.
* @param oldKey The key to replace
* @param newKey The new key
* @throws KeyAlreadyExistsException
* @throws KeyNotFoundException*/
public void changeKey(K oldKey, K newKey)
throws KeyAlreadyExistsException, KeyNotFoundException {
int i = indexOfKey(oldKey);
if(oldKey.equals(newKey)) return;
if(keyAlreadyExists(newKey)) throw new KeyAlreadyExistsException(newKey.toString());
keys[i] = newKey;
}

/**
* Replaces a value with another one.
* @param key The key representing the value to change
* @param newValue The new value
* @throws KeyNotFoundException
*/
public void changeValue(K key, V newValue)
throws KeyNotFoundException {
values[indexOfKey(key)] = newValue;
}

/**
* Dumps the hash, printing pairs of keys and values.
*
*/
public void dump() {
for(int i = 0 ; i < MAX_ELEMS ; i++)
if(keys[i] == null && values[i] == null)
System.out.println("null: null");
else
System.out.println((K) keys[i] + ": " + (V) values[i] + "");
}

public boolean isFull() {
return elemcount == MAX_ELEMS;
}

private boolean keyAlreadyExists(K key) {
for(int i = 0 ; i < MAX_ELEMS ; i++)
if(keys[i] != null && keys[i].equals(key))
return true;
return false;
}

private int indexOfKey(K key)
throws KeyNotFoundException {
for(int i = 0; i < MAX_ELEMS ; i++)
if(keys[i] != null && keys[i].equals(key))
return i;
throw new KeyNotFoundException(key.toString());
}

private int nextFreeIndex()
throws HashIsFullException {
for(int i = 0 ; i < MAX_ELEMS ; i++)
if(keys[i] == null && values[i] == null)
return i;
throw new HashIsFullException();
}

}

:flower:

PGI-Bis
27-08-2007, 13:02
Controlla la tastiera, forse non funzionano i pulsanti "{" e "}" :D

AngeL)
27-08-2007, 13:45
Controlla la tastiera, forse non funzionano i pulsanti "{" e "}" :D

tu scrivi

if(a != b) {
a = b;
}

? :eek:

^TiGeRShArK^
27-08-2007, 14:06
tu scrivi

if(a != b) {
a = b;
}

? :eek:

si pure io :fagiano:

e cmq quello che hai postato mi sa che non è un'implementazione di hash-table :mbe:

cionci
27-08-2007, 14:16
Io così:

if(a != b)
{
a = b;
}

andbin
27-08-2007, 14:25
Riconoscimento ottico di un'informazione contenuta in un'immagine a colori.

Cioè impacchettare informazioni in un'immagine e leggere le stesse informazioni da una scansione di quell'immagine (ad esempio l'immagine da "leggere" potrebbe essere la fotografia del display di un cellulare).Mazza :eek: una cosa leggera leggera, eh? :D :(
Va bene se te la faccio (forse) entro i prossimi due anni??


ah, visto che non avevo niente da fare, ho fatto l'hash :OImplementare una hash-table ben fatta non è una cosa affatto banale.
Intanto la tua classe non è affatto una hash-table, in primo luogo non vedo l'utilizzo dell'hashCode() delle chiavi..... così ad occhio sembra una banale lista di chiavi/valori.

Per fare una hash-table decente bisogna tenere in considerazione parecchie cose: l'array dei 'bucket', le liste linkate su ogni bucket non vuoto, l'operazione di rehashing se il load-factor supera una certa soglia, ecc...

Inoltre trovo inutile e illogico dichiarare le classi di exception come classi nested della tua classe.

AngeL)
27-08-2007, 14:32
Implementare una hash-table ben fatta non è una cosa affatto banale.
Intanto la tua classe non è affatto una hash-table, in primo luogo non vedo l'utilizzo dell'hashCode() delle chiavi..... così ad occhio sembra una banale lista di chiavi/valori.

Per fare una hash-table decente bisogna tenere in considerazione parecchie cose: l'array dei 'bucket', le liste linkate su ogni bucket non vuoto, l'operazione di rehashing se il load-factor supera una certa soglia, ecc...

Inoltre trovo inutile e illogico dichiarare le classi di exception come classi nested della tua classe.

ma un hash non è solo un array di valori a cui si accede tramite un array di chiavi? :mbe:

cionci
27-08-2007, 14:33
PGI: come faresti il riconoscimento ottico ? Io a suo tempo l'ho fatto con una rete neurale a perceptron con livello di input, 2 livelli interni e uno di output.

Comunque per poter confrontare in maniera fedele il codice bisognerebbe imporre più paletti. Ad esempio sarebbe utile imporre l'interfaccia della classe.

AngeL)
27-08-2007, 14:36
Comunque per poter confrontare in maniera fedele il codice bisognerebbe imporre più paletti. Ad esempio sarebbe utile imporre l'interfaccia della classe.

il mod sei tu :O

comunque lasciamo perdere l'hash e andiamo avanti :ops:

andbin
27-08-2007, 14:45
ma un hash non è solo un array di valori a cui si accede tramite un array di chiavi? :mbe:No, non è proprio così. Nella tua classe come fai a vedere se esiste una certa chiave? Vai a fare una banale ricerca lineare e per ogni elemento, testi l'uguaglianza della chiave con equals().
Questa non è un hash-table.

Hai presente quelle grosse enciclopedie cartacee su più volumi? Ne ho una in casa, anche se un po' vecchiotta. I vari volumi sono contrassegnati ognuno da due parole, es. A-ARVI per il primo, ARVO-BRACCI per il secondo, BRACCO-CHIANO per il terzo, ecc.....
Se cerco la parola "cane" non vado a prendere il primo volume e nemmeno il secondo, prendo il terzo. Ecco, questo è un po' il concetto di una hash-table: trovare velocemente una chiave.

AngeL)
27-08-2007, 14:53
No, non è proprio così. Nella tua classe come fai a vedere se esiste una certa chiave? Vai a fare una banale ricerca lineare e per ogni elemento, testi l'uguaglianza della chiave con equals().
Questa non è un hash-table.

Hai presente quelle grosse enciclopedie cartacee su più volumi? Ne ho una in casa, anche se un po' vecchiotta. I vari volumi sono contrassegnati ognuno da due parole, es. A-ARVI per il primo, ARVO-BRACCI per il secondo, BRACCO-CHIANO per il terzo, ecc.....
Se cerco la parola "cane" non vado a prendere il primo volume e nemmeno il secondo, prendo il terzo. Ecco, questo è un po' il concetto di una hash-table: trovare velocemente una chiave.

ah, ecco... io pensavo fosse solo una relazione chiavi-valori, senza contare la velocità... :doh:

PGI-Bis
27-08-2007, 17:02
PGI: come faresti il riconoscimento ottico ? Io a suo tempo l'ho fatto con una rete neurale a perceptron con livello di input, 2 livelli interni e uno di output.

Perceptron è il nome di uno dei Transformer?

Stabilisco che:

1. l'immagine è un rettangolo, eventualmente in prospettiva.
2. l'immagine contiene quattro punti di controllo
3. l'immagine è divisa in quadranti

e il programma è bello e che finito. Con i rettangoli di controllo stabilisco la dimensione dei quadranti che rappresentano i pezzi dell'informazione. Come se fossero dei bit, solo che al minimo hanno 5 valori: bianco, nero, rosso, verde e blu sono facilmente riconoscibili anche quando non siano pieni. Una volta che so quanto sono grandi i quadrati o, meglio, di quanto devo spostarmi rispetto ad uno dei punti di controllo per poter dire "hey, sto guardando il quadrante (x,y)", il gioco è fatto.

Mo' faccio un disegnino...

Semplicemente una cosa tipo:

http://www.tukano.it/tracker.png