【问题标题】:how to get only one key in a HashMap with "similar" keys如何在具有“相似”键的 HashMap 中仅获取一个键
【发布时间】:2014-07-26 18:22:22
【问题描述】:

我有一个由 String hostName 和 List serviceList 定义的对象“ObjectName”。

两个服务列表可能包含一个或多个相同的字符串。

每个字符串都是一个方法的名称。不能有同名的方法做不同的事情,也不能有不同名字的方法做同样的事情。

每个 ObjectName 都与一个唯一的整数配对。然后我创建一个

Map<ObjectName, Integer> objectPorts = new HashMap<>();

我在这个地图中添加了两个节点,它们的 serviceList 中有一个重复的字符串

示例:

objectName1的serviceList有{method1,method2,method3},而objectName2的serviceList有{method4,method2,method5}

objectPorts 包含两次字符串“method2”

现在我想在地图中搜索“method2”并执行method2的代码。我希望代码只执行一次,而不是“method2”的每个条目。

如何做到这一点?

我正在使用此代码:(编辑:添加开关部分以进行澄清)

public long executeMethod(String methodName, int n1, int n2) throws Exception {
  long result = 0;
  for(Map.Entry<Object, Integer> pair : something.entrySet()) {
    List<String> methods = pair.getkey().serviceList;
    if(methods.contains(methodName) {
      switch(methodName) {
      case "method1":
        result = arithmeticClient.method1(n1, n2);
        break;
      case "method2":
        result = arithmeticClient.method2(n1, n2);
        break;
      case "method3":
        result = arithmeticClient.method3(n1, n2);
        break;
      case "method4"
        result = arithmeticClient.method4(n1, n2);
        break;
    }
  }
  return result;
}

但它为地图中存在的每个 methodName 实例执行 methodName 的代码,所以这不是我想要的。怎么修改?

【问题讨论】:

    标签: java map iteration


    【解决方案1】:

    据我了解,您需要做的就是在 for 循环执行后跳出它。所以像这样--

    for(Map.Entry<Object, Integer> pair : something.entrySet()) {
        List<String> methods = pair.getkey().serviceList;
        if(methods.contains(methodName) {
          does something
          break;
        }
    }
    

    break 实际上是一个 java 关键字,可以“中断”您所在的当前循环。因此在代码“执行某些操作”之后添加它意味着循环将退出并且代码只会执行一次。

    【讨论】:

      【解决方案2】:

      解决这个问题的简单方法是添加一个布尔值来指示之前是否在循环期间调用了方法 2:

      public long executeMethod(String methodName, int n1, int n2) throws Exception {
        long result 0;
        boolean executed = false;
        for(Map.Entry<Object, Integer> pair : something.entrySet()) {
          List<String> methods = pair.getkey().serviceList;
           if(methods.contains(methodName) && !executed){
               //do something
               executed = true;
          }
        }
        return result;
      }
      

      如果值包含在与地图对象关联的多个列表中,这将停止方法 2 或任何其他方法的多次执行。

      【讨论】:

      • occam 的剃刀再次来袭...谢谢,应该可以完美运行
      • 除非我遗漏了一些东西,否则你正在做一堆额外的循环。为什么不在执行后立即中断循环?无需继续检查循环。
      • 对我来说这似乎是一个奇怪的数据结构,所以虽然这应该可以解决您的问题,但我会考虑制定一种不同的方法。
      • @JamesMontagne 你是对的,这确实会一直循环。我只是选择使用这种方法而不是 break 因为我不知道“做某事”的代码更灵活——例如,循环内的代码可以控制何时设置执行。从描述中听起来好像有多个对象具有相同的方法,并且在第一次找到 method2 时中断可能并不总是正确的选择(哈希映射不会按顺序返回对象)。
      • 实际上,“做某事”部分是在ObjectName对象发出四种方法之一的请求后,在四种不同的方法之间进行选择并执行一种方法的代码的切换。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2014-06-01
      • 2014-12-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      相关资源
      最近更新 更多