2012-03-21 2 views
0

Я хочу, чтобы последовательно сравнивать одну строку со всеми остальными строками, а затем переходить к следующей строке и сравнивать эти строки со всеми остальными строками ниже нее.Сравнение строки с другими строками последовательно

Вот код, который у меня есть. Он правильно сравнивает первую строку и не находит совпадений. Однако, когда другой для цикла переходит к следующему значению i, everystring = 1, и поэтому он сравнивает себя. Как я могу перемещать внутреннее для цикла одно значение каждый раз, когда я перехожу через другой цикл?

for (int everystring = 0; everystring < children.length; everystring++) { 

    String current = children[everystring].substring(0, 
     children[everystring].indexOf("_")); 

    for (int i = 1; i < children.length; i++) { 
     String innercurrent = children[i].substring(0, 
      children[i].indexOf("_")); 

     if (current.equalsIgnoreCase(innercurrent)) { 

     System.out.println("Match"); 
     } else 
     System.out.println("No Match"); 
    } 
    System.out.println(); 
} 
+0

, который будет сравнивать строку с самим собой. – user541597

+0

Я исправил это, добавив i = everystring + 1 во внешнюю петлю. – user541597

+0

Можете ли вы включить некоторые данные образца? Это могло бы помочь, если бы мы знали ваши намерения. В любом случае вы всегда можете увеличивать счетчик циклов, когда находитесь внутри цикла. просто скажите i ++; или everystring ++; – JohnnyK

ответ

1

петля всегда от 0 до children.length [во внутреннем цикле], и добавить следующее условие в начале внутреннего цикла:

if (i == everything) continue; 

Он будет пропускать все итерации внутреннего цикла где i == everything, поэтому вы будете проверять только те строки, которые неравны.

Однако обратите внимание, что вы будете проверять каждые 2 строки дважды (например: вы будете проверять i == 1, everything == 2 и i == 2, everything == 1
Если вы не хотите: итерацию во внутреннем цикле от everything + 1 до children.length

+0

ОП попросил «сравнить эти строки со всеми остальными строками ниже ...». Ваш ответ просто не позволит совместить строку с самим собой, а не пропускать все ранее проверенные строки. – sharakan

+0

@sharakan: «Ниже этого» нет четкого определения, я дал обе возможности и включил объяснение для обоих, он может выбрать то, что он предпочитает. – amit

0
This. 
for (int everystring = 0; everystring < children.length - 1; everystring++) { 

    String current = children[everystring].substring(0, 
     children[everystring].indexOf("_")); 

    for (int i = everystring + 1; i < children.length; i++) { 
     String innercurrent = children[i].substring(0, 
      children[i].indexOf("_")); 

     if (current.equalsIgnoreCase(innercurrent)) { 

     System.out.println("Match"); 
     } else 
     System.out.println("No Match"); 
    } 
    System.out.println(); 
} 
1

Если я правильно понял ваш вопрос, все, что вам нужно сделать, это использовать значение everystring в инициализаторе внутреннего цикла:

for (int everystring = 0; everystring < children.length; everystring++) { 
    String current = children[everystring].substring(0, 
    children[everystring].indexOf("_")); 
    for (int i = everystring+1; i < children.length; i++) { 
     String innercurrent = children[i].substring(0, 
     children[i].indexOf("_")); 

     if (current.equalsIgnoreCase(innercurrent)) { 

      System.out.println("Match"); 
     } else 
      System.out.println("No Match"); 
     } 
    System.out.println(); 
} 

Это будет сравнивать каждую строку со всеми строками, которые появляются после нее в массиве.

+1

Это приведет к тому, что arrayindexoutofbounds когда everystring == children.length - 1. –

+0

@RalfHoppen это не будет. 'i amit

+0

true. Извини за это. –

0
int i = 0;  

    for (int everystring = 0; everystring<children.length; everystring++){ 

     String current = children[everystring].substring(0,children[everystring].indexOf("_")); 

     i = everystring+1; 

    for (;i<children.length; i++){ 
     String innercurrent = children[i].substring(0,children[i].indexOf("_")); 



     if(current.equalsIgnoreCase(innercurrent)){ 

     System.out.println("Match"); 
     }else System.out.println("No Match"); 

     /* if (current.substring(0,current.indexOf("_")).equalsIgnoreCase(innercurrent.substring(0,innercurrent.indexOf("_")))){ 




      System.out.println("Match"); 


     }*/ 

    } 
    System.out.println(); 
    } 
} 
0

Это странный код, который вы получили там .__. но я хотел бы сделать что-то вроде этого:

for (int i = 0; i < children.length - 1; i++) { 
    String current = children[i].substring(0,children[i].indexOf("_")); 

    for (int j = i + 1; j < children.length; j++) { 
     String compareTo = children[j].substring(0,children[j].indexOf("_")); 

     if (current.equalsIgnoreCase(compareTo)) 
      System.out.format("%s matches %s\n", current, compareTo); 
     else 
      System.out.format("%s doesn't matches %s\n", current, compareTo); 
    } 
} 

таким образом, вы сравнить все только один раз и не сравнить ту же позицию себе.

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