Java Loop с условием внутри - PullRequest
0 голосов
/ 03 июля 2019

У меня нет опыта работы с Java, но мне нужно создать узел фрагмента Java в KNIME.

Я пытаюсь написать короткий цикл, который создает счетчик / итератор на основе определенного условия.Мне удалось написать часть IF IF 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 ]

2 голосов
/ 04 июля 2019

Вам нужно, чтобы счетчик цикла сохранялся между строками в фрагменте 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 голос
/ 03 июля 2019

Вам нужно работать с 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 должен быть размещен таким образом, чтобы цикл выходил из какой-либо точки, иначе цикл никогда не остановится.

В вашем коде происходит следующее:>> 1024 * увеличивает переменную на единицу, в противном случае увеличивает ее на 0.

Если вы хотите, чтобы он запускался несколько раз, вы должны использовать циклы while или for.

0 голосов
/ 03 июля 2019

Вы можете просто сделать что-то вроде:

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

Следует отметить, что с циклом do-while вы всегда будете входить в цикл, даже еслинет доступных строк (строк 0).

Кроме того, вам не нужна другая часть, так как нет смысла добавлять 0 к вашему значению, вы можете просто пропустить его.

0 голосов
/ 03 июля 2019

Я не совсем уверен, чего вы пытаетесь достичь, но я думаю, что у меня есть кое-что

    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;

это будет продолжать цикл до бесконечности. (Это может происходить внутри метода) Вы можете редактировать объект результата, чтобы повлиять на

0 голосов
/ 03 июля 2019

Ну, мы не знаем, что вы зацикливаете, но я предполагаю, что вы зацикливаете некоторые 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", но вам нужно будет сообщить нам, используете ли вы другую структуру данных или, возможно, даже поток.

0 голосов
/ 03 июля 2019

Вам нужен простой цикл, и он позаботится о вашей остальной части.

int out_user_session_counter = 1;

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

Надеюсь, это поможет.

0 голосов
/ 03 июля 2019

Попробуйте что-то вроде этого:

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; 
    }
}
...