比较java中的路径

时间:2016-03-21 12:07:42

标签: java path

我将这些路径存储在arraylist中,如下所示:

html/body/div/header/div/div/a/span 
html/body/div/div/div/div/div/div/div/div/div/h2 
html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2
html/body/div/div/div/table/tbody/tr/td/ul/li/a/h1 
html/body/div/div/div/div/table/tbody/tr/td/a/span 
html/body/div/div/div/div/table/tbody/tr/td/a/span/h1
html/body/div/div/div/div/table/tbody/tr/td/a/a/span/h1

我希望将每条路径与其他路径进行比较,并且最后只保留相似的路径, 我想要的结果是这样的:

html/body/div/div/div/table/tbody/tr/td/ul/li/a
html/body/div/div/div/div/table/tbody/tr/td/a/span

java代码是:

ArrayList<String> list_input = new ArrayList();
    ArrayList<String> list_output = new ArrayList() ;


        list_input.add("");

         list_input.add("html/body/div/header/div/div/a/span");
    list_input.add("html/body/div/div/div/div/div/div/div/div/div/h2");
    list_input.add("html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2");
    list_input.add("html/body/div/div/div/table/tbody/tr/td/ul/li/a/h1");
    list_input.add("html/body/div/div/div/div/table/tbody/tr/td/a/span");
    list_input.add("html/body/div/div/div/div/table/tbody/tr/td/a/span/h1");
    list_input.add("html/body/div/div/div/div/table/tbody/tr/td/a/a/span/h1");

        for(int a=0; a<list_input.size(); a++)
        {
            String chemin = list_input.get(a);
            for(int b=0; b<list_input.size(); b++)
                if(a != b)
                {
                    String chemin_comparé = list_input.get(b);
                    if(chemin_comparé.indexOf(chemin) != -1 && !list_output.contains(chemin))
                        list_output.add(chemin);
                }
        }

        for(String chemin_disp: list_output)
            System.out.println(chemin_disp);

但是这段代码只给出了这个结果:

html/body/div/div/div/div/table/tbody/tr/td/a/span

实际上也是

html/body/div/div/div/table/tbody/tr/td/ul/li/a

必须退回,但它是dosnt! 请帮助我,并提前感谢。

1 个答案:

答案 0 :(得分:1)

好的,现在你在这里编辑了另一个答案:

首先,要获得所有共享路径,您必须在循环中进行比较,在最后一个斜线之后切割零件,直到没有斜线:

 for(int a=0; a<list_input.size(); a++)
        {
            for(int b=0; b<list_input.size(); b++) {
                String chemin = list_input.get(a);
                if(a != b)
                {
                    String chemin_comparé = list_input.get(b);
                    while(true) {
                        if(chemin_comparé.indexOf(chemin) != -1 && !list_output.contains(chemin))
                            list_output.add(chemin);
                        if(chemin.contains("/")) {
                            chemin = chemin.substring(0, chemin.lastIndexOf("/"));
                        } else {
                            break;
                        }
                    };
                }
            }
        }

在比较以下内容时非常基本:

  • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H2
  • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H1

你必须检查:

    • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H2 含有
    • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H1
  1. 确实

    • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H2 含有
    • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL /立/ A
  2. 确实

    • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H2 含有
    • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL /立
  3. ...

    1. 是否
      • 的HTML /体/ DIV / DIV / DIV /表/ tbody的/ TR / TD / UL / LI /一个/ H2 含有
      • HTML
    2. 我上面发布的代码确实如此,总是切掉最后一个斜线,直到没有剩下。

      然而,现在你实际上拥有相同的所有路径, 包括只是“html”

      因为你只想要“最长”的相等路径,你可以简单地再次过滤输出列表,删除子串/包含在其他列表元素中的元素:

      final ArrayList<String> filteredOutputList = new ArrayList<>();
      for (String string1 : list_output) {
          boolean stringIsContainedInOtherString = false;
          for (String string2 : list_output) {
              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);