簡體   English   中英

比較java中的路徑

[英]compare path in java

我將這些路徑存儲在數組列表中,如下所示:

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

必須返回,但它不! 請幫助我,並提前致謝。

好的,既然您在這里編輯了另一個答案:

首先,要獲得所有共享路徑,您必須在循環中進行比較,在最后一個斜線之后切割部分,直到沒有斜線為止:

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

....

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

我在上面發布的代碼就是這樣做的,總是切掉最后一個斜線,直到沒有剩下的斜線為止。

但是,現在您實際上擁有所有相等的路徑,包括“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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM