2014-01-13 4 views
1

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

String[] name = {"aval", "H ---- ", "Singh", "Sawh", "Raman", " ---- ", "parminder", "kaur", "jaspreet", "asneet", " ---- "}; 

Я хочу скопировать все содержимое между «H ----» на «----». То есть это должно быть «SinghSawhRaman» (за исключением «H ----» и «----»

Что-то вроде этого:.

String keywords = ""; 
int j = 0; 
for(int i = 0; i < name.length; i++){ 
if(name[i].contains("H ---- ")){ 
    for(j = i; j < 5; j++){  
    // There problem is j < 5. I want to give a condition when name[i].contains(" ---- ") 
    // but not sure how should I be able to do it. 
    keywords = keywords + name[j]; 
    } 

Может кто-то пожалуйста, покажите мне, что лучший способ сделать ? это

ответ

3
for(j = i; !name[j].contains(" ---- "); j++){ 
     keywords = keywords + name[j]; 
    } 

это должно работать для вас, вы можете установить условие прорыва for цикла, чтобы быть любым логическим выражением

Edit:. Нужен ! там, как л oop ломается, когда условие ложно.

0

Любая причина, по которой вы используете contains вместо equals?

При использовании equals также хорошо для вас, вы могли бы использовать List:

String[] name = {"aval", "H ---- ", "Singh", "Sawh", "Raman", " ---- ", "parminder", "kaur", "jaspreet", "asneet", " ---- "}; 
List<String> s = Arrays.asList(name); 
StringBuilder sb = new StringBuilder(); 
for(int i = s.indexOf("H ---- ")+1; i < s.indexOf(" ---- "); i++) 
    sb.append(s.get(i)); 
System.out.println(sb); 
0

Я хотел бы сделать это как так

private static String copyFrom(String[] in, String begin, String end) { 
    StringBuilder sb = new StringBuilder(); 
    boolean start = false; 
    if (in != null) { 
     for (String s : in) { 
      if (!start) { 
       start = s.equals(begin); 
      } else { 
       start = !s.equals(end); 
       if (start) { 
        sb.append(s); 
       } 
      } 
     } 
    } 
    return sb.toString(); 
} 

public static void main(String[] args) { 
    String[] name = {"aval", "H ---- ", "Singh", "Sawh", 
       "Raman", " ---- ", "parminder", "kaur", 
       "jaspreet", "asneet", " ---- "}; 
    String keywords = copyFrom(name, "H ---- ", " ---- "); 
    System.out.println(keywords); 
} 

Выходы

SinghSawhRaman 
0
String keywords = ""; 
boolean append = false; 
for(j = 0; j <= name.length; j++) { 
    if(name[j].contains("H----") 
     append = true; 
    if(append) 
     keywords += name[j]; 
    if(name[j].contains("----") { 
     append = false; 
     break; 
    } 
} 

Обратите внимание на at, если вы переместите блок if(name[j].contains("H----") ниже блока if(append), вы исключите H--- из строки keywords;

0

Просто вырваться из внешнего контура, как только ваше состояние было достигнуто:

boolean capture = false; 
    for (String n : name) { 
     if (n.contains("H ---- ")) { 
      capture = true; 
     } else if (n.contains(" ---- ")) { 
      break; 
     } else if (capture) { 
      keywords = keywords + n; 
     } 
    } 

Если имеется несколько вхождений H ---- и , то не break из петли, а просто установить capture = false вместо от break.

С двумя вложенными циклами вы будете считывать любые элементы, составляющие часть имени дважды, что неэффективно. Если не возможно иметь имена с вложеннымиH ----, вам лучше удалить внутренний цикл.

0
String[] name = {"aval", "H ---- ", "Singh", "Sawh", "Raman", " ---- ", "parminder", "kaur", "jaspreet", "asneet", " ---- "}; 
String key =""; 
boolean flag = false; 
for(String s : name){ 
    if(s.equals("H ---- ")){ 
flag = true; 
} 
if(s.equals(" ---- ")){ 
flag = false; 
} 
if(flag && !s.equals("H ---- ")){ 
key+=s; 
} 
} 
System.out.println(key); 
Смежные вопросы