我想知道是否有可能拥有对象的Java字典,其中对象的某个字段被定义为字典的键。
更具体地说,这就是我想要的:我已经定义了一个包含三个字段的类。其中一个字段是Integer,对每个对象都是唯一的。我希望这个字段成为字典的关键。
答案 0 :(得分:2)
是的,当然有可能。
示例:
Map<Integer,MyClass> map = new HashMap<Integer,MyClass>();
MyClass myObject = new MyClass(...);
map.put (myObject.getIntegerKey(), myObject);
答案 1 :(得分:1)
如果您想隐藏详细信息:
public interface HasOwnKey<K> {
public K getKey();
}
public class MyMap<K, V extends HasOwnKey<K>> {
{
private Map<K,V> map = new HashMap<>();
public V put(V value) {
{
return this.map.put(value.getKey(),value);
}
public V get(K key) {
return this.map.get(key)
}
... etc
}
public class MyClass extends HasOwnKey<String> {
...
@Override String getKey() { return this.key; }
}
MyMap<String, MyClass> myMap = new MyMap<>();
MyClass obj = new MyClass();
obj.setKey("abc");
myMap.put(obj);
不幸的是,Java 7似乎不够聪明,不能从像
这样的声明中推断K
public class MyMap<V extends HasOwnKey<K>> {
所以你必须在两个地方提供Key类型而不能
MyMap<MyClass> myMap = new MyMap<>();
答案 2 :(得分:0)
您可以按照以下方式轻松完成:
public class CustomClass
{
private int primaryKey;
private int secondaryField;
private int tertiaryField;
public CustomClass(int primaryKey, int secondaryField, int tertiaryField)
{
this.primaryKey = primaryKey;
this.secondaryField = secondaryField;
this.tertiaryField = tertiaryField;
}
public int getPrimaryKey(CustomClass object)
{
return object.primaryKey;
}
}
public class Test
{
public static void main(String[] args)
{
CustomClass object = new CustomClass(10, 20, 30);
Map map = new HashMap<Integer,CustomClass>();
map.put(object.getPrimaryKey(object), object);
}
}
如果此类记录的数量相当少,您可能还需要考虑使用Enums
来做同样的事情,因为它们提供了更多的可读性。
答案 3 :(得分:0)
如果您已经创建了这些对象的List,则可以在java 8中使用聚合操作,如下所示:
Map<Integer, List<MyClass>> theMap = list
.stream()
.collect( Collectors.groupingBy(MyClass::myIntegerKey) );