Zugriff auf Map-Objekte

Encera

Aktives Mitglied
Hallo zusammen,
ich habe eine kurze Frage, und zwar habe ich eine HashMap erstellt, welche einer Nummer einen bestimmten Account zuweisen soll.
Java:
//Variablen
    private Map<String, Account> accounts;
    private Map<Integer, Block> blockMap;
    private Map<Integer, Account> minerMap;
    
    //Konstruktor
    public AccountStorage() {
        accounts = new ConcurrentHashMap<String, Account>();
        blockMap = new ConcurrentHashMap<Integer, Block>();
        minerMap = new ConcurrentHashMap<Integer, Account>();
        initAccounts();
    }

In der folgenden Methode greife ich dann auf die minerMap zu:
Code:
private void releaseBlockedBalances(Block block) {
        int key = block.getBlockNumber() - Blockchain.BLOCK_CONFIRMATIONS;
        Account account = minerMap.get(key);
        
        if(account != null) {
            double sumToUnlock = 50;
            Block blocki = blockMap.get(key);
            
            if(blocki != null) {

                for(Transaction transaction : blocki.getTransactions()) {
                    sumToUnlock += transaction.getTransactionFee();
                }
                blockMap.remove(blocki.getBlockNumber());
            }
            minerMap.remove(account);
            account.unlockBalance(sumToUnlock);
        }
    }
Java meckert nun in der Zeile "minerMap.remove(account)" etwas rum von wegen es wäre ein "unlikely Argument Type Account for remove (Object) on a Map <Integer, Account>, da ich den Account ja nicht über dem ihn zugeordneten Integer wert entfernen möchte, sondern quasi über den account "direkt". Meine Frage nun macht das irgendeinen unterschied ob ich das Element jetzt auf die ein oder andere Art aus der Map entferne?
 
Meine Frage nun macht das irgendeinen unterschied ob ich das Element jetzt auf die ein oder andere Art aus der Map entferne?
Ja, macht es. Die Map.remove(Object) Methode schaut nur nach dem "key", nicht nach dem "value" einer HashMap. Das ist ja die ganze Idee einer "Hash"-Map, dass eben O(1) Zugriff passieren kann und nicht die gesamte HashMap durchgescanned werden muss nach deinem zu entfernenden Value.
Du kannst einen Eintrag einer HashMap also nur effizient über seinen Key entfernen lassen.
 
Ja, macht es. Die Map.remove(Object) Methode schaut nur nach dem "key", nicht nach dem "value" einer HashMap. Das ist ja die ganze Idee einer "Hash"-Map, dass eben O(1) Zugriff passieren kann und nicht die gesamte HashMap durchgescanned werden muss nach deinem zu entfernenden Value.
Du kannst einen Eintrag einer HashMap also nur effizient über seinen Key entfernen lassen.
Alles klar, hab das abgeändert und entferne den Account jetzt über seine Id. Aber weil du gemeint hast "nur effizient" entfernen. Bedeutet das das der Account anders auch entfernt worden wäre? Wenn auch natürlich mit mehr aufwand verbunden.
 
Du kannst natürlich auch mit einem Iterator<Map.Entry> über alle Einträge des entrySet() mit einer Schleife gehen und dann selber prüfen, welcher Value deinem zu entfernenden Value entspricht (z.B: mit equals()) und dann die Iterator.remove() Methode verwenden.
Aber: Warum solltest du?
 

Zurück
Oben