是否可以使用哈希实现,其中键为String
且值为function
。对于背景,我有一个程序,其中有很多字符串比较,即
if(s.equalsIgnoreCase("london")
functionA();
else if(s.equalsIgnoreCase("moscow")
functionB();
else if(s.equalsIgnoreCase("delhi")
functionC();
...
等等。
但是这种实现非常昂贵(theta(n))
,因为所有if语句都进行了String
比较。如果我们有一个哈希实现,其中key为String
且值为function
,我们可以调用类似
function = hash.Get("moscow");
function();
它的复杂性很好(theta(log(1)))
。
是否可以这样做?
答案 0 :(得分:4)
您可以将它们存储在Map<String, Runnable>
中。然后用java&lt; 8:
map.put("london", new Runnable() {
public void run() { functionA(); }
});
或者使用java 8,假设一个静态方法:
map.put("london", YourClass::functionA);
或使用实例方法:
map.put("london", this::functionA);
在这三种情况下,您只需致电:
Runnable r = map.get(input.toLowerCase());
if (r != null) r.run();
答案 1 :(得分:1)
在这种情况下,您可以使用Guava函数作为Hastable值。 更好的方法是使用Java多态并在子类中定义这个逻辑(functionA,functionB):
public interface City {
public void doSomething();
}
public class Example {
private Map<String, City> cities;
public void run(String param) {
cities.get(param).doSomething();
}
}
然后根据需要定义尽可能多的城市实施(伦敦,莫斯科......),然后将它们的实例添加到地图
答案 2 :(得分:1)
在C ++中,您可以使用std :: map。 代码将是这样的 -
typedef (void)(*funcPtr)(); //declaring a compatible function pointer
std::map<std::string, funcPtr> myFunctions;
myFunctions["london"]=functionA;
myFunctions["paris"]=functionB;
//etc etc...
//calling the function
string wantedCity="london";
myFunction[wantedCity]();
编辑: 我看到你从标签中删除了C ++。 java有一个类似的容器,你可以查找它的方法。
答案 3 :(得分:1)
这是enum
:
enum City {
London {
@Override
void function() {
System.out.println("Hello from England");
}
},
Moscow {
@Override
void function() {
System.out.println("Hello from Russia");
}
},
Delhi {
@Override
void function() {
System.out.println("Hello from India");
}
};
// They ALL must have a `function`.
abstract void function ();
}
public void test() {
City.valueOf("Moscow").function();
}
答案 4 :(得分:0)
是的,只要你的方法返回一个值就可以了。例如:
public SomeReturnType doSomthing(){
return someReturnType;
}
并在您的hashmap中执行以下操作
HashMap<String, SomeReturnType> hm = new HashMap<String, SomeReturnType>();
在方法中进行比较时,布尔值可能是最佳选择。
答案 5 :(得分:0)
您可以使用Java Reflection。只需将函数名称存储为HashMap
中的值,然后按Method.invoke
调用它。