2014-01-25 1 views
0

Я хочу вызвать методы внутри цикла до тех пор, пока не будет выполнено условие (reps> = 1000), а затем перейдем за пределы цикла и проверим, какой метод был более эффективен, затем перейдите в старый метод и проигнорируйте вызов метода, который был наименее эффективным. Это возможно? Вот мой пример кода:Могу ли я проверить условие внутри цикла for и если оно выполнено, игнорировать вызов метода внутри цикла?

// Set the number of times each method is called 
public void setReps(String target, String[] sa, long reps) { 
    shuffleArray(sa); // Shuffle the order of Strings in array 

    for (int i = 0; i < reps; i++) { 
    linearStringSearch(target, sa); 
    backwardLinearStringSearch(target, sa); 
    counter(); // counts winner 

    if (reps >= 1000) 
    chooseAlgorithm(target, sa); 
} 

Таким образом, для приведенного выше кода, я буду испытывать linearStringSearch() и backwardLinearStringSearch(), чтобы увидеть, который является более эффективным после 1000 циклов, а затем я хочу, чтобы перейти обратно и игнорировать либо linearStringSearch() или backwardLinearStringSearch() на основе результата. Я мог бы написать новый цикл в методе selectAlgorithm(), но, если возможно, я предпочел бы вернуться к старой.

+4

я мог бы использовать [шаблон Strategy] (http://en.wikipedia.org/wiki/Strategy_pattern). Вы можете определить метод «stringSearch» в интерфейсе, реализовать его с помощью 'linear' и' reverse linear' search (s) ... затем написать еще одну реализацию, которая проверяет (a), (b) перед ее выбором. –

+0

Это хорошо выглядит. Я дам ему выстрел – LooMeenin

ответ

2

Нет необходимости усложнять это.

// Set the number of times each method is called 
public void setReps(String target, String[] sa, long reps) 
{ 
    boolean ChosenFastest = false; 
    boolean ForwardsIsfaster = false; 

    shuffleArray(sa); // Shuffle the order of Strings in array 

    for (int i = 0; i < reps; i++) 
    { 
     if(ChosenFastest){ 
      if(ForwardsIsFaster) 
      linearStringSearch(target, sa); 
      else 
      backwardLinearStringSearch(target, sa); 
     } else { 
     linearStringSearch(target, sa); 
     backwardLinearStringSearch(target, sa); 
     counter(); // counts winner 
     } 

     if (reps == 1000) 
      ChosenFastest = true; 
      if(ForwardsWasFastest()) //similar to choose algorithm 
      ForwardsIsfaster = true; 
      } 
     } 
    } 
} 
+1

Java не имеет типа 'bool'. И они не соответствуют названиям стиля Java. –

+0

@ElliottFrisch boolean? Вы можете отредактировать его. – user3125280

+0

Похоже, он должен работать на меня. –

1

Использовать продолжить; внутри цикла

пример:

for (int x = 0; x > 10; x++) { 
    if(x > 4){ 
     continue; 
    } 
    System.out.println("" + x); 
} 

Выход никогда не получит 5 из-за продолжать;

Источник: Java Continue statement

Для прыжков обратно, Вы могли бы иметь, если заявление внутри цикла, где не выбранного 0 = алгоритм, 1 = линейный, 2 = backwardLinear.

for (int i = 0; i < reps; i++) { 
    if(chosenAlgo == 0) { 
     linearStringSearch(target, sa); 
     backwardLinearStringSearch(target, sa); 
    if(chosenAlgo == 1) { 
     linearStringSearch(target, sa); 
    } 
    else if(chosenAlgo == 2){ 
     backwardLinearStringSearch(target, sa); 
    } 
    counter(); // counts winner 
} 
2

Один из подходов заключается в использовании Strategy pattern. Вы можете определить метод «stringSearch» в интерфейсе, реализовать его с линейным и обратным линейным поиском (-ами) ... затем написать другую реализацию, которая проверяет (a), (b) перед тем, как выбрать один (возможно, путем хранения ссылки на «правильная» стратегия после ее «инициализации»). Возможно, вам потребуется выполнить несколько разных итераций (a), (b) для учета любого периода «JVM warm-up».

UML for Strategy Pattern

0

Один подход заключается в том, что вы можете использовать два цикла for и использовать помеченный оператор continue в java.

Поскольку помеченный оператор продолжения пропускает текущую итерацию внешнего цикла, помеченного данной меткой.

Источник и ссылка - continue example

Смежные вопросы