Java:使用创建的字符串作为循环参数?

Jim*_*mpy 2 java parameters loops

简而言之,用户将输入一个数字(比如1到3).这将决定循环应该搜索的数字范围.

switch(input){
case 1:
    searchTerm = "i<10 && i>5";
case 2:
    searchTerm = "i>=10 && i<19";
case 3:
    searchTerm = "i>19 && i<24";
}
while(searchTerm){
    //some function
}
Run Code Online (Sandbox Code Playgroud)


这可能吗?我无法找到使用字符串作为搜索参数的方法.

编辑:我认为我没有很好地解释为什么我需要这个.如果有不同数量的参数,该怎么办?例如:

case 1:
    searchTerm = "i<5"
case 2:
    searchTerm = "i>25 && i<29"
case 3:
    searchTerm = "(i<50 && i>25) && (i>55 && i<75)"
case 4:
    searchTerm = "(i<20 && i>15) && (i>300 && i<325) && (i>360 && i<380)
Run Code Online (Sandbox Code Playgroud)

那怎么做呢?多个循环调用相同的函数?

T.J*_*der 9

执行此操作的正确方法是根本不使用字符串:

int min, max;

switch(input){
case 1:      // i<10 && i>5
    min = 6;
    max = 10;
    break; // to avoid follow-through to the next case
case 2:     // i>=10 && i<19
    min = 10;
    max = 20;
    break;
case 3:     // i>19 && i<24
    min = 20;
    max = 25;
    break;
default:
    // You need something here in case the value entered wasn't 1-3
}
for (int i = min; i < max; ++i) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

重新编辑:

我认为我没有很好地解释为什么我需要这个.如果有不同数量的参数,该怎么办?

在这种情况下,您将不得不使用表达式求值程序(或写一个,这是一个非平凡的任务).例如,春天有一个(不推荐,只是碰巧听到它).搜索"Java表达式评估程序"应该会出现一些选项.

另一个替代方案,虽然有些人把你的问题误认为是Java 脚本问题,但有点有趣,就是使用Java内置的JavaScript评估器(Rhino或Nashorn).例如:实例

import javax.script.*;

class Ideone {
    public static void main(String[] args) throws java.lang.Exception {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        String searchTerm = "i >= 19 && i <= 24";
        int i;
        try {
            i = 19;
            engine.put("i", i);
            while ((boolean)engine.eval(searchTerm)) {
                System.out.println("i = " + i);
                ++i;
                engine.put("i", i);
            }
            System.out.println("Done");
        } catch (ScriptException scriptException) {
            System.out.println("Failed with script error");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...但是你仍然有确定要使用的初始值的问题i,我已经在上面硬编码了.


Dmi*_*nko 5

Java 8中,您可以选择lambda而不是String:

Predicate<Integer> searchTerm = (Integer v) -> false;

switch (input) {
  case 1:
    searchTerm = (Integer v) -> v < 10 && v > 5;

    break;
  case 2:
    searchTerm = (Integer v) -> v >= 10 && v < 19;

    break;
  case 3:
    searchTerm = (Integer v) -> v > 19 && v < 24;

    break;
}

while (searchTerm.test(i)) {
  ...
}
Run Code Online (Sandbox Code Playgroud)