2016-11-11 5 views
1

Ich versuche, meine Daten in eine Datenstruktur wie Map<String, Map<String, Map<String, Position>>> zu setzen. Zum Beispiel habe ich unterschiedliche Konten, jedes Konto hat unterschiedliche Strategien, jede Strategie hat unterschiedliche Sicherheiten und jede Sicherheit hat eine Reihe von Positionen.Optimieren einer Datenstruktur wie Map <String, Map <String, Map <String, Position >>>

Dann ist das Problem, wenn ich nach einer Position suchen möchte, muss ich dreimal suchen. Gibt es einen besseren Weg, das obige Szenario besser zu implementieren? Jemand sagte mir, ich könnte key + value als Schlüssel benutzen, um eine HashMap zu erstellen (ich kann mich nicht an die Details erinnern und das verstehe ich nicht ganz).

Soweit ich weiß, kann ich einen Arraylist: [account, strategy, security] als Schlüssel zum Erstellen einer HashMap verwenden.

Kann mir bitte jemand einen Vorschlag machen?

+6

Erstellen Sie eine benutzerdefinierte Klasse, die Konto, Strategie und Sicherheit einkapselt. Implementieren Sie 'equals()' und 'hashCode()' und Sie können es als Schlüssel verwenden. – shmosel

+0

Sie können versuchen, multimap http://stackoverflow.com/questions/36244782/refactoring-java-map-of-map-of-map –

+1

Sorry, wenn es offensichtlich ist, aber ich denke, Sie müssen einige Datenbank verwenden. –

Antwort

1

Ich stimme mit shmosels Kommentar. Ich habe das geschrieben, um es auszuprobieren. Sie können es verwenden, wenn Sie nicht weiterkommen.

Encapsulation.java

class Encapsulation { 
    String account; 
    String strategy; 
    String security; 

    public Encapsulation(String account, String strategy, String security) { 
    this.account = account; 
    this.strategy = strategy; 
    this.security = security; 
    } 

    @Override 
    public String toString() { 
    return "Encapsulation{" + 
     "account='" + account + '\'' + 
     ", strategy='" + strategy + '\'' + 
     ", security='" + security + '\'' + 
     '}'; 
    } 

    @Override 
    public int hashCode() { 
    int result = account.hashCode(); 
    result = 31 * result + strategy.hashCode(); 
    result = 31 * result + security.hashCode(); 
    return result; 
    } 

    @Override 
    public boolean equals(Object o) { 
    if (this == o) { 
     return true; 
    } 
    if (!(o instanceof Encapsulation)) { 
     return false; 
    } 
    Encapsulation that = (Encapsulation) o; 
    if (!account.equals(that.account)) { 
     return false; 
    } 
    if (!strategy.equals(that.strategy)) { 
     return false; 
    } 
    return security.equals(that.security); 
    } 
} 

Position.java

import java.util.Arrays; 
import java.util.List; 

class Position{ 
    @Override 
    public String toString() { 
    return "Position{" + 
     "positions=" + Arrays.toString(positions.toArray()) + 
     '}'; 
    } 

    public List<String> positions; 
} 

MultiMapImplementation.java

package com.bhavya.stackoverflow.examples.q40553869; 

import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Map; 


public class MultiMapImplementation { 
    public static void main(String[] args) { 
    Map<Encapsulation, Position> encapsulationPositionMap = new HashMap<>(); 
    Encapsulation encapsulation = new Encapsulation("ac1", "strat1", "sec1"); 
    Position position = new Position(); 
    position.positions = Arrays.asList("position1","position2"); 
    encapsulationPositionMap.put(encapsulation,position); 

    encapsulationPositionMap.forEach((key,value) -> System.out.println(key.toString() + value.toString())); 
    } 
} 

gibt diese Ausgabe

Encapsulation{account='ac1', strategy='strat1', security='sec1'}Position{positions=[position1, position2]} 

Also, für HashMap abschließend effizient Ihre Key-Klasse zu arbeiten, sollte die hashCode liefern und gleich Methoden.

Verwandte Themen