在单个数据结构中维护来自两种不同类型值的java映射

在单个数据结构中维护来自两种不同类型值的java映射,java,Java,我有一组看起来像 class Widget { String name; int id; // Intuitive constructor omitted } 有时我想按名称查找项目,有时我想按id查找项目。显然,我可以通过 Map<String, Widget> mapByName; Map<Integer, Widget> mapById; Map地图名称; mapById; 但是,这需要维护两个映射,在某个时刻,我(或不熟悉双映射的其他用户)将对代

我有一组看起来像

class Widget {
  String name;
  int id;
  // Intuitive constructor omitted
}
有时我想按名称查找项目,有时我想按id查找项目。显然,我可以通过

Map<String, Widget> mapByName;
Map<Integer, Widget> mapById;
Map地图名称;
mapById;
但是,这需要维护两个映射,在某个时刻,我(或不熟悉双映射的其他用户)将对代码进行更改,并只更新其中一个映射

显而易见的解决方案是创建一个类来管理这两个映射。这样的类是否已经存在,可能在第三方包中

我正在寻找一种可以让我按照

DoubleMap<String, Integer, Widget> map = new DoubleMap<>();
Widget w = new Widget(3, "foo");
map.put(w.id, w.name, w);
map.get1(3); // returns w
map.get2("foo"); // returns w
DoubleMap map=newdoublemap();
小部件w=新小部件(3,“foo”);
地图放置(w.id,w.name,w);
图1(3);//返回w
map.get2(“foo”);//返回w

一个简单的解决方案是,编写自己的包含两个键的键类

class WidgetKey {
  String id;
  String name;
  boolean equals() {...}
  boolean hashCode() {...}
}

Map<WidgetKey, Widget> yourMap;
类WidgetKey{
字符串id;
字符串名;
布尔等于(){…}
布尔hashCode(){…}
}
绘制你的地图;

请注意,您必须在WidgetKey类中实现equals和hashCode。否则,put/get和其他映射方法将无法正常工作。

如何实现它们?听起来id和名称是唯一的。如果是这种情况,只需使用
Map
将每个小部件放入同一个Map中两次即可。您可以使用一个类包装所有这些内容,它公开一个
add(Widget)
和两个gets。对于“equals”和“hashCode”,有几种实现方法。1.使用IDE生成它们2。使用第三方LIB,如EqualBuilder和HashCodeBuilder 3。我看不出这是怎么回事。我想您可以将hashCode实现为
返回0
,将equals实现为
返回this.id.equals(other)| | this.name.equals(other)
,但这是非正统的。当我试图获取某些内容时,我只有两个键值中的一个。如果使用HashMap作为Map的实现,则实现
hashCode()返回0
不是一个好主意,因为HashMap中的主键是使用HashMap的哈希值。你看过公共图书馆吗?或者,如果您不想要一个新的依赖项,您是否尝试过让它由IDE生成?