我有用户将在命令行/终端Java程序上输入的命令列表(i,h,t等)。我想存储命令/方法对的哈希:
'h', showHelp()
't', teleport()
这样我就可以得到类似以下的代码:
HashMap cmdList = new HashMap();
cmdList.put('h', showHelp());
if(!cmdList.containsKey('h'))
System.out.print("No such command.")
else
cmdList.getValue('h') // This should run showHelp().
这可能吗?如果没有,那么简单的方法是什么?
使用Java 8+和Lambda表达式
使用lambda(可在Java 8+中使用)进行以下操作:
class Test {
public static void main(String[] args) throws Exception {
Map<Character, Runnable> commands = new HashMap<>();
// Populate commands map
commands.put('h', () -> System.out.println("Help"));
commands.put('t', () -> System.out.println("Teleport"));
// Invoke some command
char cmd = 't';
commands.get(cmd).run(); // Prints "Teleport"
}
}
在这种情况下,我很懒惰并重用了该Runnable
接口,但是也可以使用Command
我在答案的Java 7版本中发明的-interface
。
此外,() -> { ... }
语法还有其他选择。你也可以具有和的成员函数help,teleport
并使用YourClass::helpresp
。YourClass::teleport
代替。
Java 7及以下
你真正想要做的是创建一个接口Command(例如命名)(或例如重用Runnable),然后让你的地图成为type Map
import java.util.*;
interface Command {
void runCommand();
}
public class Test {
public static void main(String[] args) throws Exception {
Map<Character, Command> methodMap = new HashMap<Character, Command>();
methodMap.put('h', new Command() {
public void runCommand() { System.out.println("help"); };
});
methodMap.put('t', new Command() {
public void runCommand() { System.out.println("teleport"); };
});
char cmd = 'h';
methodMap.get(cmd).runCommand(); // prints "Help"
cmd = 't';
methodMap.get(cmd).runCommand(); // prints "teleport"
}
}
Reflection "hack"
话虽如此,你实际上可以完成你所要的工作(使用反射和Method
类)。
import java.lang.reflect.*;
import java.util.*;
public class Test {
public static void main(String[] args) throws Exception {
Map<Character, Method> methodMap = new HashMap<Character, Method>();
methodMap.put('h', Test.class.getMethod("showHelp"));
methodMap.put('t', Test.class.getMethod("teleport"));
char cmd = 'h';
methodMap.get(cmd).invoke(null); // prints "Help"
cmd = 't';
methodMap.get(cmd).invoke(null); // prints "teleport"
}
public static void showHelp() {
System.out.println("Help");
}
public static void teleport() {
System.out.println("teleport");
}
}
我有一个用户将在命令行/终端Java程序中输入的命令列表(I,h,t等)。我想存储命令/方法对的哈希: 这样我就可以拥有类似于以下内容的代码: 这可能吗?如果不是,有什么简单的方法可以做到这一点?
问题内容: 假设您有一个键类(KeyClass),该键类具有重写的equals,hashCode和clone方法。假设它有2个基本字段,一个String(名称)和一个int(id)。 现在您定义 现在 因此,就HashMap而言,keyOriginal,keyCopy和keyClone是无法区分的。 现在,如果您使用keyOriginal将条目放入HashMap,则可以使用keyCopy或keyC
问题内容: 我的哈希图将字符串存储为键,将arraylist存储为值。现在,我需要将其嵌入到列表中。也就是说,它将具有以下形式: 这些是我使用的声明: 谁能帮我在列表中使用哪种方法以及如何继续将地图存储到其中? 问题答案: 始终尝试在Collection中使用接口引用 ,这会增加灵活性。 以下代码有什么问题? 您可以像上面一样轻松地进行操作。
我正在尝试使用put方法将arraylist存储在hashmap中。我在下一步中清除了列表,以便在下一次迭代中添加下一组值。一旦清除列表,地图中的值也会被清除。虽然我在清理清单之前已经把清单放在地图上了。 sysout打印{key=[]} 有人请让我清楚如何坚持hashmaphash地图。
问题内容: 我对Redis中的HSET有疑问。据我所知,redis是一个键值数据库。这意味着所有事物都存储为键值,例如,我们没有表。我想在redis中保存一些内容,所以我决定使用Hashmap。由于HMSET已过时,我们应该改用HSET,我应该如何在hset中存储许多属性作为值和id作为键?你知道我想保存这样的东西: 但是,如果我要保存很多字段,我应该为每个字段写这一行?例如 : 如在HSET中,