简体   繁体   English

比较java中的路径

[英]compare path in java

i have those paths stored in arraylist like this :我将这些路径存储在数组列表中,如下所示:

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

i want compare each path with other, and keep at the end only the similar path , result that i want is like this :我想将每条路径与其他路径进行比较,最后只保留相似的路径,我想要的结果是这样的:

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

the java code is : 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);

but this code give only this result :但这段代码只给出了这个结果:

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

in fact that also事实上这也

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

must be returned but it dosnt !必须返回,但它不! please help me , and thanks in advance .请帮助我,并提前致谢。

Okay, now that you edited here another answer:好的,既然您在这里编辑了另一个答案:

First, to get all shared path you have to compare in a loop, cutting of the part after the last slash until there is no slash left:首先,要获得所有共享路径,您必须在循环中进行比较,在最后一个斜线之后切割部分,直到没有斜线为止:

 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;
                        }
                    };
                }
            }
        }

So basicly when comparing the following:所以基本上在比较以下内容时:

  • 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/h2
  • html/body/div/div/div/table/tbody/tr/td/ul/li/a/h1 html/body/div/div/div/table/tbody/tr/td/ul/li/a/h1

You have to check:你必须检查:

  1. Does

    • html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2 contain 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/table/tbody/tr/td/ul/li/a/h1
  2. Does

    • html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2 contain 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 html/body/div/div/div/table/tbody/tr/td/ul/li/a
  3. Does

    • html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2 contain html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2 包含
    • html/body/div/div/div/table/tbody/tr/td/ul/li html/body/div/div/div/table/tbody/tr/td/ul/li

.... ....

  1. Does
    • html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2 contain html/body/div/div/div/table/tbody/tr/td/ul/li/a/h2 包含
    • html html

The Code I posted above does exactly that, allways cutting of the last slash until there is none left.我在上面发布的代码就是这样做的,总是切掉最后一个斜线,直到没有剩下的斜线为止。

However, now you actually have ALL path that are equal, including just "html"但是,现在您实际上拥有所有相等的路径,包括“html”

since you only want the "longest" equal path, you can simply filter the output list again, removing elements that are substrings / contained in other list-elements:由于您只想要“最长”的相等路径,您可以简单地再次过滤输出列表,删除子字符串/包含在其他列表元素中的元素:

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM