2016-03-27 2 views
-1

я набор путей, как это:сравнивающие пути в Java

body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2]/div/span[2] 
body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2]/a/h2 
body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1]/div[2]/a/span 
body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1]/div[4]/div[2]/a/span[1] 
body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[9]/div/div/div/div[2]/div[3]/div[1]/div[8]/a/span 
body/div[2]/div[3]/div/div[2]/div/div[2]/div/div/ul[4]/li[4]/a/span[1] 

это Java-код, который найти схожие пути и вернуть его:

List<String> output= new ArrayList<>(); 
List<String> hh = new ArrayList<>(); 
output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2]/div/span[2]"); 
output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2]/a/h2"); 
output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1]/div[2]/a/span"); 
output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1]/div[4]/div[2]/a/span[1]"); 
output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[9]/div/div/div/div[2]/div[3]/div[1]/div[8]/a/span"); 
output.add("body/div[2]/div[3]/div/div[2]/div/div[2]/div/div/ul[4]/li[4]/a/span[1]"); 
for(int a=0; a<output.size(); a++) 
     { 
      for(int b=0; b<output.size(); b++) { 
       String chemin = output.get(a); 
       if(a != b) 
       { 
        String chemin_comparé = output.get(b); 
        while(true) { 
         if(chemin_comparé.indexOf(chemin) != -1 && !output.contains(chemin)) 
          hh.add(chemin); 
         if(chemin.contains("/")) { 
          chemin = chemin.substring(0, chemin.lastIndexOf("/")); 
         } else { 
          break; 
         } 
        } 
       } 
      } 
     } 

     final ArrayList<String> filteredOutputList = new ArrayList<>(); 
for (String string1 : hh) { 
    boolean stringIsContainedInOtherString = false; 
    for (String string2 : hh) { 
     if(!string2.equals(string1) && string2.contains(string1)) { 
       stringIsContainedInOtherString = true; 
       break; 
     } 
    } 
    if(!stringIsContainedInOtherString && !filteredOutputList.contains(string1)) { 
     filteredOutputList.add(string1); 
    } 
} 

for(String filteredOutput: filteredOutputList) 
    System.out.println(filteredOutput); 

и дать мне результат, как это:

body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2] 
body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1] 

это хорошо, но в моем случае я хочу повторить еще раз эту функцию до тех пор, i'got только один общий путь к конечному результату должно быть как это:

body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2] 

ответ

1

Поместите свой код внутри функции и вызовите его рекурсивно по некоторым критериям. Попробуйте что-то вроде этого:

public static void main(String [] args) { 
     List<String> output = new ArrayList<>(); 
     output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2]/div/span[2]"); 
     output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[2]/a/h2"); 
     output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1]/div[2]/a/span"); 
     output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[8]/div/div/div/div[2]/div[3]/div[1]/div[4]/div[2]/a/span[1]"); 
     output.add("body/div[2]/div[3]/div/div[1]/div/div[2]/div[2]/ul/li[9]/div/div/div/div[2]/div[3]/div[1]/div[8]/a/span"); 
     output.add("body/div[2]/div[3]/div/div[2]/div/div[2]/div/div/ul[4]/li[4]/a/span[1]"); 
     List<String> hh = findCommonSubstring(output); 
     for(String filteredOutput: hh) 
      System.out.println(filteredOutput); 

    } 

    private static List<String> findCommonSubstring(List<String> output) { 
     List<String> hh = new ArrayList<String>(); 
     for(int a=0; a<output.size(); a++) 
     { 
      for(int b=0; b<output.size(); b++) { 
       String chemin = output.get(a); 
       if(a != b) 
       { 
        String chemin_compare = output.get(b); 
        while(true) { 
         if(chemin_compare.indexOf(chemin) != -1 && !output.contains(chemin)) 
          hh.add(chemin); 
         if(chemin.contains("/")) { 
          chemin = chemin.substring(0, chemin.lastIndexOf("/")); 
         } else { 
          break; 
         } 
        } 
       } 
      } 
     } 

     final ArrayList<String> filteredOutputList = new ArrayList<>(); 
     for (String string1 : hh) { 
      boolean stringIsContainedInOtherString = false; 
      for (String string2 : hh) { 
       if(!string2.equals(string1) && string2.contains(string1)) { 
         stringIsContainedInOtherString = true; 
         break; 
       } 
      } 
      if(!stringIsContainedInOtherString && !filteredOutputList.contains(string1)) { 
       filteredOutputList.add(string1); 
      } 
     } 

     if (filteredOutputList.size()>1) 
      return findCommonSubstring(filteredOutputList); 
     return filteredOutputList; 
    } 
+0

сейчас работает, у меня была проблема с функциями рекурсификаций: D, теперь это понятно! , Спасибо вам – kivok94