【问题标题】:How to avoid calling a function multiple times in Java?如何避免在 Java 中多次调用函数?
【发布时间】:2019-07-16 15:12:57
【问题描述】:

我正在调用具有不同值的函数来获得特定结果。有什么方法可以减少这样的调用函数以提高 Java 的性能和可靠性?

func(1,6);
func(4,0);
func(2,7);
func(5,0);
func(3,0);


private static void func(int printer,int printing){
        if(printing == 0){
            for(int j=1;j<=7;j++){
                if(j!=printer){
                    arrayOdd.add(j);
                }
            }
        }else{
            for(int j=1;j<=7;j++){
                if(j!=printer && j!=printing)
                    arrayOdd.add(j);
            }
        }
    }

【问题讨论】:

  • 你有调用 func() 的逻辑或模式吗?我没有看到一个。您有值列表并在循环中调用函数
  • 您能否更具体地说明您的目标?

标签: java data-structures


【解决方案1】:

我的第一个注意事项是您可以将函数替换为

private static void func(int printer,int printing){
    for(int j=1;j<=7;j++){
        if(j!=printer && j!=printing)
            arrayOdd.add(j);
    }
}

它的行为是一样的。

我的第二个注意事项是重复调用函数不会对性能或可靠性产生任何影响,除非您使用递归,在这种情况下您可能会遇到经典的堆栈溢出错误。为什么您希望/需要减少调用该函数的次数?

【讨论】:

    【解决方案2】:

    如果上述函数可以是幂等的(相同的输入总是产生完全相同的输出)我会建议记忆 (https://java2blog.com/memoization-example-java/)。
    在看到函数输出时,看起来您只是从 7 位的固定数组中删除传递的值。如果这就是您要查找的全部内容,只需从数组中删除元素并记住函数。这样,该函数将仅执行最坏情况的 64 次(对于 0,1,2 3,4 ,5,6,7 的 2 位组合的 64 种不同组合)

    【讨论】:

      【解决方案3】:

      您可以将打印机的值和打印的值放在 List 或数组中,但您需要手动放置参数,只要没有逻辑保持输入即可。 我的意思是这样的事情

      int final static THE_TIMES_YOU_CALLED_THE_FUNC=5;
      
      List<int[]> list =new ArrayList<>(THE_TIMES_YOU_CALLED_THE_FUNC);
              list.add(new int []{1,6});
              list.add(new int []{4,0});
              list.add(new int []{2,7});
              list.add(new int []{5,0});
              list.add(new int []{3,0});
      
              for(int i=0;i<list.size();i++){
                  funk(list.get(i)[0],list.get(i)[]);
              }
          }
      
          private static void func(int printer,int printing){
              if(printing == 0){
                  for(int j=1;j<=7;j++){
                      if(j!=printer){
                          arrayOdd.add(j);
                      }
                  }
              }else{
                  for(int j=1;j<=7;j++){
                      if(j!=printer && j!=printing)
                          arrayOdd.add(j);
                  }
              }
          }
      

      最后编译器会调用func 5次,我看不出我的灵魂有什么好处,但你最终想写一次func。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        相关资源
        最近更新 更多