2016-03-20 9 views
0

Ich versuche eine Liste von Quell- und Zielelementen (die zum Beispiel über Dropdown-Menüs ausgewählt werden können) für einen Währungsrechner zu implementieren, der sich auch abhängig voneinander ändern muss.Welche Datenstruktur funktioniert am besten für 2 verbundene Listen?

Für z.B. Wenn ich eine Quellwährung auswähle, möchte ich die Zielliste auf nur unterstützte Quellen für diese Quelle ändern. Und umgekehrt, wenn ich also eine Zielwährung wähle, die nur von einigen Quellen unterstützt werden kann, sollte sich die Quellliste entsprechend ändern.

Eine Option, denke ich, kann eine Liste aller Währungen sein, die jeweils eine Liste der unterstützten Quell- und Zielwährungen enthalten. Oder gibt es einen besseren Ansatz, dies zu implementieren?

+0

Was sind Ihre Währungen? Behalten Sie sie als Fäden oder haben Sie eine Klasse? Irgendein Code könnte hilfreich sein. – Filkolev

+1

Verwenden Sie einfach eine einzelne 'Liste >'. –

Antwort

0

Ich wäre sehr überrascht, wenn die Leistung eine Überlegung hier sein sollte - vor allem, wenn dies für die Fahr-GUI-Elemente wie Pulldown-Listen. So würde ich vorschlagen, am einfachsten und am direktesten ist am besten. Etwas wie:

interface Exchange { 
    Currency getSource(); 
    Currency getTarget(); 
    double getRate(); 
} 

public class Exchanges { 
    private final List<Exchange> exchanges = new ArrayList<>(); 

    public Stream<Currency> getSourcesWithTarget(Currency target) { 
     return exchanges.stream() 
      .filter(e -> e.getTarget().equals(target)) 
      .map(Exchange::getSource).distinct(); 
    } 

    public Stream<Currency> getTargetsWithSource(Currency source) { 
     return exchanges.stream() 
      .filter(e -> e.getSource().equals(source)) 
      .map(Exchange::getTarget).distinct(); 
    } 

    public double getRate(Currency source, Currency target) { 
     return exchanges.stream() 
      .filter(e -> e.getSource().equals(source) && e.getTarget().equals(target)) 
      .map(Exchange::getRate) 
      .findAny().orElseThrow(IllegalArgumentException::new); 
    } 
} 

Die getRate Methode ist ein Bonus :-)