哈希表,其中键是字符串,值是函数

时间:2014-03-08 19:44:26

标签: java hash

是否可以使用哈希实现,其中键为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)))

是否可以这样做?

6 个答案:

答案 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调用它。

Class.getMethod(String name, Class... parameterTypes)

Method.invoke(Object obj, Object... args)