有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的xpath比较路径

我有一组这样的路径:

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]

这很好,但在我的情况下,我想再次重复这个函数,直到我只得到一条公共路径,最终结果应该是这样的:

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

共 (1) 个答案

  1. # 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;
        }