对象字典,其中key是Java中的实例字段

时间:2014-07-30 18:25:41

标签: java dictionary

我想知道是否有可能拥有对象的Java字典,其中对象的某个字段被定义为字典的键。

更具体地说,这就是我想要的:我已经定义了一个包含三个字段的类。其中一个字段是Integer,对每个对象都是唯一的。我希望这个字段成为字典的关键。

4 个答案:

答案 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) );