带有条件的Java循环

时间:2019-07-03 13:34:27

标签: java knime

我没有Java经验,但是我需要在KNIME中创建Java代码段节点。

我正在尝试编写一个短循环,根据特定条件创建一个计数器/迭代器。我设法编写了IF THEN ELSE部分,但我想知道如何将其放入循环中:

out_user_session_counter = 1;

if (c_session_end.equals("session end")) {
    out_user_session_counter = out_user_session_counter + 1; 
} else {
    out_user_session_counter = out_user_session_counter + 0;
}

这个想法是:每次c_session_end.equals("session end") 那么out_user_session_counter应该增加1

UPD。:这是带有循环结果(不正确的结果)的数据模型的屏幕截图:

example screenshot

正确的预期结果将是1 1 1 1 2 2 3 3 3 3 3 而不是1 1 1 1 11 1 11 1 1 1 1

7 个答案:

答案 0 :(得分:2)

您需要循环计数器才能在Java代码段的行之间保留。为此,请在代码段的//Your custom variables:部分中对其进行定义:

int sessionCounter=0;

然后在//Enter you code here:部分:

if("session end".equalsIgnoreCase(c_column2)){
    sessionCounter++;
}

out_user_session_counter = sessionCounter;

如图所示,“会话结束”行将包含递增的计数器。如果希望它包含旧计数器,请更改代码段,以使上面的最后一行在if语句之前。

您无需将其放入KNIME中的循环中-片段的表达式部分已经为每个输入行顺序计算了。为了清楚起见,下面在代码段对话框中显示了

enter image description here

答案 1 :(得分:1)

您需要使用for / while循环来实现这一目标。

int out_user_session_counter = 1; //Step 1

while(c_session_end.equals("session_end")) { //Step 2
     out_user_session_counter++;  //Step 3
     //Step 4 Other code to modify c_session_end.equals("session_end")
}

第1步。在这一步中,我们将变量初始化为1

第2步。而变量等于session_end

第3步。将变量增加1(请注意,这与out_user_session_counter = out_user_session_counter + 1;相同)

第4步。必须放置用于修改c_session_end值的代码,以使循环从某个角度退出,否则循环将永远不会停止。

在您的代码中发生的是以下=> if(c_session_end.equals("session end"))将变量加1,否则将其加0。

如果要使其多次运行,则必须使用whilefor循环。

答案 2 :(得分:0)

尝试这样的事情:

out_user_session_counter = 1;
int loopCycles = 10

for(int i = 0; i < loopCycles; i++){
    if (c_session_end.equals("session end")) {
        out_user_session_counter = out_user_session_counter + 1; 
    }
}

答案 3 :(得分:0)

您需要一个简单的循环,这将照顾您自己的其他部分。

int out_user_session_counter = 1;

while(c_session_end.equals("session end")){
  out_user_session_counter++;
}

希望这会有所帮助。

答案 4 :(得分:0)

好吧,我们不知道您正在循环播放什么,但是我假设您正在循环一些String
此示例显示如何循环包含会话事件的List<String>并同时计数等于"session end"的事件:

public static void main(String[] args) {
    // create a data structure for sample data
    List<String> sessionEvents = new ArrayList<String>();
    // add some sample data
    sessionEvents.add("session start");
    sessionEvents.add("session somthing");
    sessionEvents.add("session end");
    sessionEvents.add("session start");
    sessionEvents.add("session something");
    sessionEvents.add("session something");
    sessionEvents.add("session something");
    sessionEvents.add("session end");
    sessionEvents.add("session start");
    sessionEvents.add("session something");
    sessionEvents.add("session end");

    // define a counter variable (considering Java naming conventions)
    int outSessionCounter = 0;

    // use an enhanced for loop (aka for-each loop)
    for (String sessionEvent : sessionEvents) {
        // every time the event is "session end"...
        if (sessionEvent.equals("session end")) {
            // ... increment the counter
            outSessionCounter++;
        }
    }

    // print the result
    System.out.println("Amount of session ends is " + outSessionCounter);
}
  

这只是统计"session end"的出现,但是您必须告诉我们是否使用其他数据结构甚至是流。

答案 5 :(得分:0)

我不确定您要达到的目标,但我认为我有一些想法

    class Result{
        public int out_user_session_counter = 1;
        public String c_session_end;
    }
    Result r = new Result();
    r.c_session_end = /*[whatever you want it to be];*/ "";
    Thread thread = (new Thread(new Runnable() {
        int out_user_session_counter = 1;

        public void run() {
            out_user_session_counter = 1;
            while (!Thread.interrupted()) {
                if (r.c_session_end.equals("session end")) {
                    out_user_session_counter++;
                    r.out_user_session_counter = out_user_session_counter;
                }
                //code to modify the r.c_session_end
            }
        }
    }));
    thread.start();
    //to get the result do
    int result = r.out_user_session_counter;

这将无限期地循环(这可以在方法中进行) 您可以编辑结果对象以影响

答案 6 :(得分:0)

您可以简单地执行以下操作:

    out_user_session_counter = 1;
    int loop_counter =0;
    int rows = 10 //or some other variable that contains the number of rows 
    while(loop_counter < rows) {
       if (c_session_end.equals("session end")) {
          out_user_session_counter = out_user_session_counter++; 
          loop_counter++; 
       }
       System.out.println(out_user_session_counter); 
    }

您需要做的就是在代码的外部添加一个循环。任何循环都可以,我使用了while循环。您也可以使用for循环。

for(int i = 0; ii < rows; ii++){
   if (c_session_end.equals("session end")) {
      out_user_session_counter = out_user_session_counter++; 
   }
   System.out.println(out_user_session_counter);   
}

或者,您可以使用do-while循环:

int index = 0; 
do{
   if (c_session_end.equals("session end")) {
      out_user_session_counter = out_user_session_counter++; 
      index++; 
   }
   System.out.println(out_user_session_counter); 
} while (index < rows); 

应该注意的是,即使没有可用的行(行为0),使用do-while循环,也总是会进入循环。

此外,您不需要else部分,因为将0加到您的值没有意义,您可以直接跳过它。