哪种数据结构最适合2个相关列表

时间:2016-03-20 22:48:07

标签: java data-structures api-design

我正在尝试为货币兑换计算器实现一个源项目和目标项目列表(例如可以通过下拉列表选择),这也需要相互改变。

例如当我选择源货币时,我想将目标列表更改为仅支持该源的列表。反之亦然,因此,如果我选择的目标货币只能从某些来源获得支持,则源列表应相应更改。

我认为一个选项可能是所有货币的清单,每个货币都包含支持的来源和目标货币列表?或者有更好的方法来实现这个吗?

1 个答案:

答案 0 :(得分:0)

如果在这里需要考虑性能,我会非常惊讶 - 特别是如果这是用于驱动GUI元素,如下拉列表。所以我建议最简单,最直接最好。类似的东西:

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);
    }
}

getRate方法是奖励: - )