栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java中的多级映射[重复]

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的多级映射[重复]

您可以使用您的特定密钥:

class MyKey {    Double beta;    Double yaw;    int minute;    public int hashCode() {            }    @Override    public boolean equals(Object obj) {            }}

然后简单地:

data.put(myKey, obj);

这样,“多级检查”全部隐藏在中

MyKey.equals()
。它可以使客户端代码保持干净,并且关键的复杂性放在安全的地方。

需求更改后进行编辑:

如果最重要的是,您希望能够获得从双

beta
精度对象到对象的映射,那么我仍然会像这样保持平面。

您真正想要的是为数据提供多个“索引”(例如在数据库中),以便您可以查询具有相同“ beta”或“
yaw”的对象。为此,最好的方法是使用多个Map(实际上是Multimap),每个“索引”使用一个。

使用番石榴的Multimap:

ListMultimap<Double, Data> mapForBeta;ListMultimap<Double, Data> mapForYaw;

您可以将所有的multimap和

Map<MyKey, Data>
放在您的特定类中。实际上,最好的方法是子类化
Map<MyKey, Data>

public class MyMap extends HashMap<MyKey, Data> {    ListMultimap<Double, Data> mapForBeta;    ListMultimap<Double, Data> mapForYaw;    public Data put(MyKey key, Data value) {        super.put(key, value);        mapForBeta.add(key.beta, value);        mapForYaw.add(key.yaw, value);    };    public List<Data> getFromBeta(Double beta) {        return mapForBeta.get(beta);    }    public List<Data> getFromYaw(Double yaw) {        return mapForYaw.get(yaw);    }}

具有更好解决方案的新编辑:

实际上,这让我开始思考,我意识到您的地图默认值确实存在问题,这就是为什么您的代码有点混乱的原因。

您可以使用生成器来创建基础地图的默认地图来解决此问题:

public class DefaultMap<K, V> extends TreeMap<K, V> {    static abstract class Generator<V>{        abstract V create();    }    final Generator<V> generator;    DefaultMap(Generator<V> generator) {        this.generator = generator;    }    @Override    public V get(Object key) {        V val = super.get(key);        if (val == null) { val = generator.create(); put((K)key, val);        }        return val;    }}

现在,您可以使用实用程序树类来存储所有数据:

public class MyTree {  private final Map<Double, Map<Double, Map<Integer, Data>>> data;  public MyTree() {    data = new DefaultMap<>(new Generator<Map<Double, Map<Integer, Data>>>() {      @Override      Map<Double, Map<Integer, Data>> create() {        return new DefaultMap<>(new Generator<Map<Integer, Data>>() {          @Override          Map<Integer, Data> create() { return new TreeMap<>();          }        });      }    });  }  void add(MyKey d, Data obj) {    data.get(d.beta).get(d.yaw).put(d.minute, obj);  }}

现在,您可以使用data.get(beta).get(yaw)访问数据,并且没有意大利面条代码来存储您的值。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506229.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号