Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
Abbiamo intervistato Sumit Dhawan, CEO di Proofpoint, per capire come stia cambiando il mondo della sicurezza con l'avvento dell'intelligenza artificiale e con il ritmo sempre più serrato a cui vengono trovate vulnerabilità nel software. Un problema significativo, che richiederà del tempo per essere risolto (o quantomeno arginato)
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-12-2005, 14:54   #1
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
[JAVA] Problema con la HashMap

Ciao, sto sviluppando un programma in Java che dovrebbe poi permettermi di elaborare tutta una serie di statistiche sulle estrazioni del Lotto (ho tutto lo storico dal 1939!). Ho già scritto parecchie classi ma sto avendo un problema con le HashMap e non riesco a capire perché. Naturalmente non posto tutto il codice (sarebbe troppo lungo) ma solo un pezzettino che ho rifatto a mo' di test:

Codice:
import java.lang.*;
import java.util.*;

class Terno
{
    private byte[] numeri;

    public Terno (byte n1, byte n2, byte n3)
    {
        numeri = new byte[3];

        numeri[0] = n1;
        numeri[1] = n2;
        numeri[2] = n3;
    }

    public boolean equals (Terno t)
    {
        for (int i=0; i<3; i++)
            if (numeri[i] != t.numeri[i])
                return false;

        return true;
    }

    public int hashCode ()
    {
        return ((int) numeri[2]) * 8100 + ((int) numeri[1]) * 90 + ((int) numeri[0]);
    }

    public String toString ()
    {
        return numeri[0] + ", " + numeri[1] + ", " + numeri[2];
    }
}


public class ProvaTerno
{
    public static void main (String argv[])
    {
        HashMap map = new HashMap (704880);
        int n = 0;

        for (byte i=1; i<=90; i++)
        {
            for (byte j=1; j<=90; j++)
            {
                for (byte k=1; k<=90; k++)
                {
                    if (i != j && j != k && i != k)
                    {
                        Terno t = new Terno (k, j, i);

                        map.put (t, "aaa");
                        n++;
                    }
                }
            }
        }

        System.out.println ("Inseriti: " + n);
        System.out.println ("Dimensione map: " + map.size ());

        Terno t = new Terno ((byte) 5, (byte) 6, (byte) 7);

        System.out.println (t.toString () + (map.containsKey (t) ? " contenuto" : " non contenuto"));
    }
}
In pratica ho una semplice classe Terno che contiene 3 numeri. Ridefinisco i metodi equals(), hashCode() e toString().
Nel main creo un HashMap con capacità di 704880 (che sono tutte le possibili combinazioni per un Terno, prendendo i numeri da 1 a 90 senza ripetizioni e ignorando l'ordine) e poi ci metto nell'HashMap tutte le combinazioni una per una. Come valore ho messo "aaa" tanto per provare (io dovrò metterci un altro oggetto).
Alla fine vado a vedere se è contenuto il Terno 5,6,7.

Avviando questo programma ottengo:

Codice:
Inseriti: 704880
Dimensione map: 704880
5, 6, 7 non contenuto
In pratica non trova il Terno. Ma non lo trova nemmeno se faccio esplicitamente:
Codice:
map.put (new Terno ((byte) 5, (byte) 6, (byte) 7), "aaa");
ed è questo che è strano!
Cosa può essere?? Forse il metodo hashCode non è giusto??
Uso il JDK 1.4.2_08-b03.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2005, 15:25   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao
non ho avuto tempo e modo di verificare approfonditamente, ma vorrei esporti alcuni suggerimenti:

- (C'entra poco) 704880 e' il numero di ripetizioni che ottieni TENENDO CONTO dell'ordine. Infatti ottieni questo numero scrivendo sia (1,2,3) sia (3,2,1) e considerandole differenti. Se dividi questo numero per 3! = 6, allora ottieni il numero delle combinazioni senza ripetizione che non tiene conto dell'ordine, cioe' proprio
n!/(k! * (n-k)!) (il binomiale) = 117480

- Da quello che ho capito (purtroppo non sono ancora passato alla j5), questa HashMap va a controllare il "Riferimento" all'oggetto (visto che sei programmatore C/C++, il puntatore). Lui non sa quale procedure utilizzare per la comparazione e non la ridefinisci scrivendo una equals(obj) nell'oggetto da memorizzare.
Ad orecchio, visto che la HashMap implementa la Map(), immagino che dovrai estendere la HashMap, mettendoci la TUA implementazione della suddetta procedura.

Fammi sapere

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2005, 15:44   #3
kingv
Senior Member
 
L'Avatar di kingv
 
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
di sicuro hai sbagliato a ridefinire "equals".
Devi fare l'overriding di quello con firma:

public boolean equals(Object obj)
kingv è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2005, 16:00   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da sottovento
- (C'entra poco) 704880 e' il numero di ripetizioni che ottieni TENENDO CONTO dell'ordine. Infatti ottieni questo numero scrivendo sia (1,2,3) sia (3,2,1) e considerandole differenti. Se dividi questo numero per 3! = 6, allora ottieni il numero delle combinazioni senza ripetizione che non tiene conto dell'ordine, cioe' proprio
n!/(k! * (n-k)!) (il binomiale) = 117480
Scusa ... quando ho detto "ignorando l'ordine" mi sono espresso male. Io intendevo dire appunto che in un Terno, le combinazioni 1,2,3 e 3,2,1 sono la stessa cosa e quindi non differenti. Sai, non sono esperto di calcolo combinatorio!
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2005, 16:05   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da kingv
di sicuro hai sbagliato a ridefinire "equals".
Devi fare l'overriding di quello con firma:

public boolean equals(Object obj)
Sì, è proprio così! Solo qualche minuto dopo aver postato mi è venuto in mente che il problema era nella equals. Siccome mi capita raramente di dover ridefinire equals(), mi sono confuso, visto che ero già un po' ... fuso.
L'ho corretto e funziona. Grazie.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2005, 12:46   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Ragazzi ... l'altro giorno che ho postato il codice penso di aver "cannato" (di brutto) il calcolo delle combinazioni, vero???
Ho ripreso una mia guida sul Calcolo Combinatorio ed ho visto che in realtà il numero esatto di combinazioni per un terno al lotto è di 117480 e non 704880!!!
Infatti nel primo caso (117480) si parla di "combinazioni senza ripetizioni" mentre nel secondo caso (704880) si parla di "disposizioni senza ripetizioni".
Io in effetti nel codice:
Codice:
for (byte i=1; i<=90; i++)
{
    for (byte j=1; j<=90; j++)
    {
        for (byte k=1; k<=90; k++)
        {
            if (i != j && j != k && i != k)
            {
                ...
            }
        }
    }
}
eliminavo le ripetizioni grazie al test nel if ma non le varie disposizioni!!!
Ho quindi pensato un attimo a come eliminare anche le disposizioni ed ho modificato semplicemente il test così:
Codice:
if (i < j && j < k)
In questo modo elimino ripetizioni e disposizioni. Giusto?
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2005, 12:59   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Penso sia meglio modificare i cicli for:
- il for piu' lento (i) va da 1 a 88;
- il for medio (j) va da i + 1 a 89;
- il for piu' veloce (k) va da j+1 a 90;

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2005, 13:09   #8
kingv
Senior Member
 
L'Avatar di kingv
 
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
Quote:
Originariamente inviato da sottovento
Penso sia meglio modificare i cicli for:
- il for piu' lento (i) va da 1 a 88;
- il for medio (j) va da i + 1 a 89;
- il for piu' veloce (k) va da j+1 a 90;

High Flying
Sottovento

esatto, è piu' elegante e ti risparmi un bel po' di iterazioni:

Codice:
for (int i=1; i<=90; i++)
{
    for (int j=i+1; j<=90; j++)
    {
       for (int k=j+1; k<=90; k++)
        {
                        Terno t = new Terno ((byte)i, (byte)j, (byte)k);
                        map.put (t, "aaa");
                        n++;
        }
    }
}
kingv è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2005, 13:28   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Giustissimo!!! Avrei dovuto pensarci subito (ci sarei arrivato eh! )
Grazie a tutti e due (sottovento e kingv).
In effetti così si risparmiano molto cicli (non che debba avere chissà quali prestazioni comunque, è un programmino "didattico", ma è sicuramente una miglioria).
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2005, 13:50   #10
kingv
Senior Member
 
L'Avatar di kingv
 
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
ho riletto quello che ho scritto, gli indici giusti sono quelli suggeriti da sottovento, funzionalmente non cambia nulla ma ti risparmi ancora qualche ciclo
kingv è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
Rocket Lab acquisisce Iridium: nasce un ...
Una ventola nascosta e un design fuori d...
Display e fotocamera insieme: a Zurigo n...
Lenovo Idea Tab Plus, il tablet per stud...
Un ingegnere di AMD ha riprodotto in cas...
SanDisk Optimus cresce con nuovi SSD cer...
Loongson contro Intel e AMD: dalla Cina ...
Australia, quasi tutti gli under-16 aggi...
Oltre 1.300 miliardi di dollari per la p...
Un nuovo studio mette in dubbio la natur...
Crisi Volkswagen, torna l'ipotesi cessio...
Il CERN spegne il Large Hadron Collider:...
Stranger Than Heaven avrà una storia mol...
Il futuro prezzo di PS6 preoccupa i gioc...
AMD Ryzen 10000 sempre più vicini...
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: 00:29.


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