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

时间:2015-08-05 07:47:00

标签: java loops parameters

简而言之,用户将输入一个数字(比如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
}

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

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

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)

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

4 个答案:

答案 0 :(得分: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) {
    // ...
}

重新编辑:

  

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

在这种情况下,您必须使用表达式求值程序(或写一个,这是一个非平凡的任务)。例如,Spring中有一个(不推荐,只是碰巧听到它)。搜索&#34; Java表达式评估程序&#34;应该提出一些选择。

另一种选择,虽然有些人把你的问题误认为是Java Script 问题,但是使用Java内置的JavaScript评估器(Rhino或Nashorn)有点有趣。例如:Live Example

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");
        }
    }
}

...但您仍然有确定i使用的初始值的问题,我已在上面硬编码。

答案 1 :(得分: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)) {
  ...
}

答案 2 :(得分:0)

您可以创建如下的枚举。

public enum SearchTerms {

    None(""),
    Between6And9("i<10 && i>5"),
    Between10And18("i>=10 && i<19"),
    Between20And23("i>19 && i<24");

    private final String stringValue;

    SearchTerms(String stringValue) {
        this.stringValue = stringValue;
    }

    public String getStringValue() {
        return stringValue;
    }

    public static SearchTerms fromStringValue(String stringValue) {
        for (SearchTerms searchTerm : values()) {
            if (searchTerm.getStringValue().equalsIgnoreCase(stringValue)) {
                return searchTerm;
            }
        }
        return SearchTerms.None;
    }

}

用法:

SearchTerms searchTerm = SearchTerms.fromStringValue("i<10 && i>5");

switch(searchTerm) {
    case Between6And9:
        //dosomething
        break;
}

答案 3 :(得分:-5)

您可以使用duplicity-full.manifest duplicity-full.sigtar.gz duplicity-full-signatures.sigtar.gz duplicity-inc.33Z.to.914Z.manifest duplicity-inc.33Z.to.914Z.vol1.difftar.gz duplicity-new-signatures.33Z.to.914Z.sigtar.gz JavaScript。

另外,请不要忘记每个.eval()

末尾的break;

查看此fiddle

以下是摘录。

case: