Java 一个Hashmap,有一组有限的键,每个键只接受一种类型的值?
好吧,这可能有点难以解释。我正在寻找一种构建某种Hashmap的方法,它将填充我已经知道的键(因为它们是我正在创建的对象的属性)。这些已知键中的每一个都将具有字符串、int或float(将自动装箱)的值,或者——稍后——某种对象/函数的值(我仍然不知道我将如何完成这一部分,但无论如何,这将更进一步)。我还想设置接受每个键的类型(比如键“x”只接受整数类型的值,键“equation”只接受字符串,等等)Java 一个Hashmap,有一组有限的键,每个键只接受一种类型的值?,java,android,hashmap,tweener,Java,Android,Hashmap,Tweener,好吧,这可能有点难以解释。我正在寻找一种构建某种Hashmap的方法,它将填充我已经知道的键(因为它们是我正在创建的对象的属性)。这些已知键中的每一个都将具有字符串、int或float(将自动装箱)的值,或者——稍后——某种对象/函数的值(我仍然不知道我将如何完成这一部分,但无论如何,这将更进一步)。我还想设置接受每个键的类型(比如键“x”只接受整数类型的值,键“equation”只接受字符串,等等) 为了提供更多的上下文,我的目标是构建一个Tweener实用程序,因为我在Java中没有发现这样
为了提供更多的上下文,我的目标是构建一个Tweener实用程序,因为我在Java中没有发现这样的库,除了SumoTween,它根本不适合我的需要。我试着用Caurina的方式来构建我的课程。如果你有一个更好的选择,可以节省我的时间和麻烦,请随意分享(关于Tweeners或关于我的Hashmap问题)。顺便说一句,我做这个Tweener是为了在我正在构建的Android游戏中使用它,以便在位图/可绘制对象上制作动画(不能为那些afaik使用动画类)
PS:这是我在这个网站上的第一个问题,我希望我不要听起来太困惑;请耐心听我说。如果我理解正确,您基本上是在寻找哈希映射。对吗
是的,我知道用这种方式使用“Object”不是很漂亮。如果我理解正确,你基本上是在寻找一个HashMap。对吗
是的,我知道这样使用“Object”不是很漂亮。为什么要使用hashmap?如果您知道“键”,只需使用这些成员创建一个类,然后您就可以随意键入它们
如果出于某种原因确实必须使用hashmap,您可以扩展它并重写put()方法来检查您的魔法值。但我强烈建议不要这样做,这是一个糟糕的设计。为什么要使用hashmap呢?如果您知道“键”,只需使用这些成员创建一个类,然后您就可以随意键入它们
如果出于某种原因确实必须使用hashmap,您可以扩展它并重写put()方法来检查您的魔法值。但我强烈建议不要这样做,因为它的设计很差。我不完全确定这是否是您所要求的,但听起来您可以为键使用某种接口/抽象类,并为每种键类型适当地实现/扩展它,例如:
public interface Key {}
private static final class StringKey implements Key {
private final String value;
public StringKey(String value) {
this.value = value;
}
// hashCode, equals here
}
// IntegerKey, FloatKey, etc similarly
然后做一些类似的事情:
HashMap<Key, Integer> map = new HashMap<Key, Integer>();
HashMap map=newhashmap();
我不完全确定这是否是您所要求的,但听起来您可以为密钥使用某种类型的接口/抽象类,并针对每种密钥类型适当地实现/扩展它,例如:
public interface Key {}
private static final class StringKey implements Key {
private final String value;
public StringKey(String value) {
this.value = value;
}
// hashCode, equals here
}
// IntegerKey, FloatKey, etc similarly
然后做一些类似的事情:
HashMap<Key, Integer> map = new HashMap<Key, Integer>();
HashMap map=newhashmap();
我建议创建一个从say HashMap继承的自定义类,在插入时检查指定的键/值是否有效
public static final HashMap<String, Class<?>> allowedTypes = new HashMap<String, Class<?>>() {{
put("key1", String.class);
put("key2", Integer.class);
// etc
}};
public class CustomHashMap extends HashMap {
public Object put(Object key, Object value) {
Class<?> type = allowedTypes(key);
if(type != null && !type.isInstance(value))
throw new IllegalArgumentException("Invalid type for key " + key);
return put(key, value);
}
private void PutAll(Map m) {
for(Entry<?, ?> entry : m.entrySet())
put(entry.getKey(), entry.getValue());
}
}
publicstaticfinalhashmap>(){{
put(“key1”,String.class);
put(“key2”,Integer.class);
//等
}};
公共类CustomHashMap扩展了HashMap{
公共对象put(对象键、对象值){
类类型=允许的类型(键);
if(type!=null&!type.isInstance(value))
抛出新的IllegalArgumentException(“键的类型无效”+键);
返回put(键、值);
}
专用void PutAll(地图m){
对于(条目:m.entrySet())
put(entry.getKey(),entry.getValue());
}
}
我建议创建一个从say HashMap继承的自定义类,在插入时检查指定的键/值是否有效
public static final HashMap<String, Class<?>> allowedTypes = new HashMap<String, Class<?>>() {{
put("key1", String.class);
put("key2", Integer.class);
// etc
}};
public class CustomHashMap extends HashMap {
public Object put(Object key, Object value) {
Class<?> type = allowedTypes(key);
if(type != null && !type.isInstance(value))
throw new IllegalArgumentException("Invalid type for key " + key);
return put(key, value);
}
private void PutAll(Map m) {
for(Entry<?, ?> entry : m.entrySet())
put(entry.getKey(), entry.getValue());
}
}
publicstaticfinalhashmap>(){{
put(“key1”,String.class);
put(“key2”,Integer.class);
//等
}};
公共类CustomHashMap扩展了HashMap{
公共对象put(对象键、对象值){
类类型=允许的类型(键);
if(type!=null&!type.isInstance(value))
抛出新的IllegalArgumentException(“键的类型无效”+键);
返回put(键、值);
}
专用void PutAll(地图m){
对于(条目:m.entrySet())
put(entry.getKey(),entry.getValue());
}
}
您可以有单独的映射,一个用于字符串;当添加到这些映射中的任何一个时,您可以将密钥添加到(全局)集合中,以确保在映射中没有重复的密钥。我怀疑这并不能很好地满足您的需求(当然,查找更复杂),但如果它对您有效,那就太好了
也许更好的选择是添加另一个间接级别。使您的映射成为Hashmap,其中您的东西对于您想要持有的每种类型都有子类。因此,StringYourThing有一个字符串数据成员;一个IntegerYourThing有一个int数据成员,等等。当我发现YourThing开始使用另一个类中的switch语句的功能时,我不会感到惊讶,这个类试图一致地处理所有这些不同的数据类型。如果该类可以简单地与YourThing交互,它可能会变得更简单。但是,如果不查看代码,就很难知道;当添加到这些映射中的任何一个时,您可以将密钥添加到(全局)集合中,以确保在映射中没有重复的密钥。我怀疑这并不能很好地满足您的需求(当然,查找更复杂),但如果它对您有效,那就太好了 也许更好的选择是添加另一个间接级别。使您的映射成为Hashmap,其中您的东西对于您想要持有的每种类型都有子类。因此,StringYourThing有一个字符串数据成员;一个IntegerYourThing有一个int数据成员,等等。当我发现YourThing开始具有功能时,我不会感到惊讶