Torna indietro   Hardware Upgrade Forum > Software > Programmazione

In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX 341QPXW14G è un monitor ultrawide da 34 pollici che porta la tecnologia QD-OLED di quinta generazione in un contesto principalmente orientato alla produttività. La qualità dell'immagine è elevatissima, il formato 21:9 è ideale per il multitasking e la dotazione di porte trasforma il monitor in un vero hub per Mac, PC e dispositivi mobili. Il limite principale è invece il refresh rate di soli 144 Hz, che lo allontana dai giocatori competitivi più esigenti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-04-2011, 02:29   #1
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
[Java]Ordinare i valori di una hashtable

Salve!
Ho una hastable con chiavi univoche e valori double del tipo
{55555455=10152.48, 55556566=10129.049999999996, 45555555=10190.599999999999, 55655455=10151.2, 54565555=10190.599999999999, 55555545=10190.599999999999, 54555545=10190.599999999999, 55465565=10190.599999999999, 46555554=10115.449999999999, 65564554=10246.75, 55555555=10190.599999999999, 56656565=10190.599999999999, 55565455=10152.48, 55454564=10228.999999999998, 55655556=10120.799999999996, 65565555=10190.599999999999, 55655445=10151.2, 55565545=10271.299999999997, 64544655=10302.399999999996}

I numeri a sinistra sono le chiavi(tipo 55555455),sono univoche.

Ho bisogno di ordinare gli elementi secondo il valore, in questo caso il numero che è circa 10k. Dopo aver fatto questo ordinamento devo prendere i primi 10 risultati.......

Come posso fare?
Grazie
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2011, 02:32   #2
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
Sono riuscito a traslare i valori dalla hashtable ad un arraylist, e ad ordinarli in modo crescente(anche se avrei preferito decrescente, visto che devo selezionare i primi 10 valori).
Solo cosi perdo il riferimento alle chiavi associate ai valori che c'erano nella hastable....

Codice:
if(ht.containsKey(firstelement)==false){
ht.put(firstelement,secondelement);}
ArrayList Al=new ArrayList(ht.values());
Collections.sort(Al);
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 05-04-2011, 08:51   #3
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao,
Hashtable (java.util.Hashtable) implementa Map, e fa quindi parte del Collection Framework del JDK.

Puoi quindi invocare entrySet sulla tua hashtable per ottenere il Set delle Map.Entry che contiene (una Map.Entry rappresenta una coppia chiave-valore).

Per ordinare questo set di coppie chiave-valore puoi usare il metodo Collection.sort che prende come argomenti una lista e un Comparator.

La lista la costruisci al volo passando il set di Map.Entry come parametro al costruttore di ArrayList; il Comparator per le MapEntry lo definisci tu: sarà un comparator che confronta l'elemento "valore" delle Map.Entry

In codice (non l'ho compilato, potrebbe contenere errori)
Codice:
// il comparator
Comparator<Map.Entry<Integer,Double>> comp = 
    new Comparator<Map.Entry<Integer,Double>>() {
        public int compare(Entry<Integer,Double> e1, Entry<Integer,Double> e2) {
            return Double.compare(e1.getValue(), e2.getValue());
        }
    };

// mytable e' la tua Hashtable
// Integer e' il tipo chiave e Double e' il tipo valore
Set<Map.Entry<Integer,Double>> entries = mytable.entrySet();

// costruisce la lista di entries
List<Map.Entry<Integer,Double>> entrylist = 
    new ArrayList<Map.Entry<Integer,Double>>(entries);

// ordina la lista 
Collections.sort(entriylist, comp);
Potresti anche considerare di usare una java.util.TreeMap al posto della Hashtable, se possibile. TreeMap ti consentirebbe di stabilire da subito una relazione d'ordine tra gli elementi che verrebbe preservata ad ogni mutazione della mappa stessa.
__________________

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 : 05-04-2011 alle 09:02.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 06-04-2011, 16:49   #4
Gold
Member
 
L'Avatar di Gold
 
Iscritto dal: Oct 2002
Messaggi: 133
Con una treeMap.

Ne istanzi una nuova col comparator che ti ha scritto banryu, gli passi la mappa che hai gia', poi cicli quante volte vuoi chiamando il metodo pollFirstEntry() (o pollLastEntry(), a seconda dell'ordine che gli dai) che restituisce e rimuove il primo (ultimo) elemento della mappa

Saluto
Gold è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 09:40   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Gold Guarda i messaggi
Con una treeMap.

Ne istanzi una nuova col comparator che ti ha scritto banryu, gli passi la mappa che hai gia', poi cicli quante volte vuoi chiamando il metodo pollFirstEntry() (o pollLastEntry(), a seconda dell'ordine che gli dai) che restituisce e rimuove il primo (ultimo) elemento della mappa

Saluto
Anche io pensavo a TreeMap (a parte le considerazioni circa le performance) ma la cosa non è proprio "immediata", perchè TreeMap vuole un comparatore per le chiavi, lui invece ordina in base ai valori... se conoscesse/usasse Guava (ex Google Collections) potrebbe usare una BiMap...

@Edit: però BiMap richiede che le chiavi e i valori siano univoci.
__________________

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 : 07-04-2011 alle 10:35.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 12:11   #6
Gold
Member
 
L'Avatar di Gold
 
Iscritto dal: Oct 2002
Messaggi: 133
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Anche io pensavo a TreeMap (a parte le considerazioni circa le performance) ma la cosa non è proprio "immediata", perchè TreeMap vuole un comparatore per le chiavi, lui invece ordina in base ai valori... se conoscesse/usasse Guava (ex Google Collections) potrebbe usare una BiMap...

@Edit: però BiMap richiede che le chiavi e i valori siano univoci.
Hai ragionissima.

Non conosco quella BiMap (dopo me la vado a vedere), pero' a naso direi che potrebbe assomigliare alla BidiMap di commons collection, che dovrebbe fare al caso suo.
Quindi direi una TreeBidiMap

Saluto
Gold è offline   Rispondi citando il messaggio o parte di esso
Old 07-04-2011, 15:45   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Gold Guarda i messaggi
Hai ragionissima.

Non conosco quella BiMap (dopo me la vado a vedere), pero' a naso direi che potrebbe assomigliare alla BidiMap di commons collection, che dovrebbe fare al caso suo.
Quindi direi una TreeBidiMap

Saluto
Vero, si somigliano.
Ma se uno adotta una libreria per una feature particolare, considerato che parliamo di librerie di strutture dati, c'è il "rischio" che con il tempo (insomma, è probabile) tenda a usare sempre più feature di quella libreria.

In questo caso consiglio Guava (Google) rispetto a Common Collection (Apache) principalmente per questi motivi:
- Guava supporta i Generics, ComColl no
- Guava è stata sviluppata sforzandosi di aderire il più possibile ai contratti delle collezioni così come espressi dal Java Collection Framework (Josh Bloch ha fatto da consulente)
- il progetto Guava è bello vispo, Common Collection è un po' "fermo"...

Per chi volesse ulteriori info:
- intervista ai due prinicipali responsabili di Guava
- talk di presentazione della Google Collection Library (ora Guava)
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 10:04   #8
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
Non riesco a capire come funziona il vostro codice...
ho cercato di andare avanti da me con un codice di questo tipo

1)Si costruisce la ht con dimensione massima di 3 (in questo caso l'ho messa semplice)
2)Per tutti i valori che arrivano dopo che si è riempita la ht si scansiona la ht e se c'è un valore inferiore, viene sostituito
3) in questo modo la ht contiene sempre i primi 3 valori,i 3 risultati migliori


Codice:
if (dimension < 3) {
				ht.put(firstelement, secondelement);
				dimension++;
				output.println("Ciao mamma");
			} else {
				
				Enumeration elements = ht.elements();
				while (elements.hasMoreElements()) {
					
					int performance = (Integer) elements.nextElement();
					output.println(performance);
					
					if (performance < Integer.parseInt(secondelement)) {
						ht.put(firstelement, secondelement);
						
					}
				}
			}
Purtroppo non va...ci deve essere qualche errore
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 10:56   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
@neosephiroth86:
Ciao, dopo aver letto il tuo post #1 e il tuo ultimo post #8 non riesco a capire quale è il problema che devi risolvere e quali sono i tuoi requisiti (a parte il fatto che, sembra, *devi* usare Hashtable).

Puoi chiarire la situazione?
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:09   #10
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
ho un generatore di valori del tipo "chiave","valore"
Voglio mantenere una lista, in questo caso usando la struttura hashtable, con i primi 10 valori, anche non in ordine crescente.

del tipo "chiave 1" "10270"
"chiave 2" "10370"
"chiave 3" "10170"

etc

Siccome non sono riuscito bene a capire la vostra soluzione, ho pensato di implementarne io una + semplice, di cui di seguito lo pseudocodice

\\riempio la hastable con le prime dieci coppie chiave valore che mi arrivano (tanto sono per forza buone)
\\ per ogni altra coppia scandisco la hastable, se trovo un coppia chiave valore con valore inferiore, sovrascrivo

In questo modo ho una hastable di 10 elementi che sono i "migliori" di tutti quelli che mi sono arrivati
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:18   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da neosephiroth86 Guarda i messaggi
ho un generatore di valori del tipo "chiave","valore"
Voglio mantenere una lista, in questo caso usando la struttura hashtable, con i primi 10 valori, anche non in ordine crescente.
In pratica vorresti una sorta di cache in cui tenere i 10 risultati più alti generati dal generatore man mano che li genera (cache nel generatore) oppure del generatore non te ne frega una mazza, tu hai solo una valanga di risultati dalla quale estrarre una volta e per sempre i primi 10 valori?
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:20   #12
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
no ho bisogno di una cache...
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:23   #13
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da neosephiroth86 Guarda i messaggi
no ho bisogno di una cache...
Ah, ok, bene.
Prossima domanda: quando il generatore genera una nuova entry [key,value] dove viene memorizzata la entry (in che tipo di collezione)?
@EDIT: ammesso che il generatore memorizzi le entry, in effetti immagino che non lo faccia, ma semplicemente la restituisca ad un qualche chiamante?
__________________

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 : 08-04-2011 alle 11:28.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:32   #14
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
beh non memorizzo le entry...
io faccio ogni volta hashtable.put(firstelement,secondelement);
Dove firstelement è la key e secondelement il valore..
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:44   #15
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da neosephiroth86 Guarda i messaggi
beh non memorizzo le entry...
io faccio ogni volta hashtable.put(firstelement,secondelement);
Dove firstelement è la key e secondelement il valore..
Ottimo, ultima domanda: devi assolutamente usare una Hastable per implementare la tua cache oppure sei libero di scegliere l'implementazione che preferisci?
Generator deve essere thread-safe?
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:48   #16
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
no, non deve per forza essere una hastable
Uso hashtable perchè si sposa col concetto di chiave-valore, ed inoltre perchè se aggiungo un elemento alla hashtable che già c'è (coppia chiave-valore) viene ignorato,o sbaglio?
Ah una coppia chiave-valore è univoca, non possono esistere due coppie con chiavi uguali e valori differenti..

Per quanto riguarda thread-safe... si è meglio thread safe.
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 11:50   #17
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
Per cercare di aiutarti ti posto un blocco + ampio di codice

Codice:
	while (true) {

			m0 = getMessageSynch();
			Vector<String> vector = (Vector) m0.getObject();
			StringTokenizer st = new StringTokenizer(vector.elementAt(0)
					.toString());
			String firstelement = new String(st.nextToken());
			String secondelement = new String(st.nextToken());
			
			
			if (dimension < 10) {
				ht.put(firstelement, secondelement);
				dimension++;
				
			} else {
				
				Enumeration elements = ht.elements();
				while (elements.hasMoreElements()) {
					
					double performance = (Double) elements.nextElement();
					output.println(performance);
					
					if (performance < Double.parseDouble(secondelement)) {
						ht.put(firstelement, secondelement);
						
					}
				}
			}
			output.println(ht.toString());

		}
	}
}
Si trova in while(true) perchè è un agente di servizio di un software multiagente, e aspetta i messaggi di centinaia di agenti utenti che effettuano dei calcoli e fanno report a questo agente qui...
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 12:19   #18
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Codice:
...
if (dimension < 10) {
    ht.put(firstelement, secondelement);
    dimension++;	
} else {
    Enumeration elements = ht.elements();
    while (elements.hasMoreElements()) {
        double performance = (Double) elements.nextElement();
        output.println(performance);
					
    if (performance < Double.parseDouble(secondelement)) {
        ht.put(firstelement, secondelement);	
    }
}
...
Così però stai inserendo le prime 10 entry, e poi se ti arriva una entry maggiore di una qualsiasi altra entry già presente la inserisci (senza però eliminarne nessuna), ecco perchè non ti va.
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 12:25   #19
neosephiroth86
Member
 
Iscritto dal: Oct 2007
Messaggi: 185
un possibile fix?
neosephiroth86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-04-2011, 12:38   #20
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da neosephiroth86 Guarda i messaggi
un possibile fix?
Beh, avendo trovato il valore da sostiutire (performance):
Codice:
...
if (performance < Double.parseDouble(secondelement)) {
        ht.put(firstelement, secondelement);	
    }
...
devi trovare la chiave associata a performance (il che implica iterare tutte le chiavi), invocare remove sulla hastable con quella chiave (il che rimuove anche il valore, performance) quindi inserire la nuova chiave (firstelement) con il nuovo valore (secondoelement).

Questo se non puoi/vuoi astrarre un po' di più le cose (ad esempio creando una classe apposita per rappresentare la tua Entry di interi-double, e un'altra tipo Cache che gestisca sto meccanismo di tenere in memoria solo le 10 Entry con i valori più alti generati -- dietro le quinte può usare quello che vuole per implementare la cache, non sei più per forza legato ad Hashtable perchè non ti serve neccessariamente una mappa/dizionario ne neccessariamente una struttura dati thread-safe, dato che sarà solo l'accesso a Cache a dover essere thread-safe).
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Schermo OLED e touch: il MacBook sta per...
Addio conversioni: Google Drive e Docs o...
Arriva il portale di Google che smascher...
Gli iPhone 18 Pro non convincono: Apple ...
NVIDIA torna su macOS con un driver non ...
Engwe ha un modello che è il SUV ...
Le migliori offerte del weekend Amazon: ...
Cina e UE, intesa sulle auto ibride: Pec...
2 lavatrici slim COMFEE’ a 255€ o 280€ s...
Anche a ottobre tornano i coupon nascost...
Robot ECOVACS DEEBOT MINI a 198,98€ su A...
E-bike in offerta: una in stile Engwe a ...
Auricolari Motorola Moto Buds a 24,90€: ...
Tim Berners-Lee a Torino: 'Voglio un'IA ...
Ring ancora a prezzi super su Amazon: ci...
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: 08:04.


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