2012-07-18 112 views
0

我有一个url表我想加载,表中可以有一个或多个时间的网址。只加载一次网址一次

例如,一个包含三个值的表:url1,url2 url1。

所以,之后,我加载一个url,提取他的一个html片段(例如a)。

我有这样的:

HtmlPage page=null; 


for (int i = 0; i < tableUrlSource.length; i++) { 
try { 
       page = webClient.getPage(tabUrlSource[i]); 
       List<HtmlElement> nbElements = (List<HtmlElement>) page.getByXPath(tabXpathSource[i]); 
       if (null != nbElements && !nbElements.isEmpty()) { 
        htmlResult = nbElements.get(0).asText(); 

    } 

... 

但是,这不是更有效,因为它会加载为url1两次,网址一次。 所以它会喜欢有三个URL加载,然后,使治疗更长。

我怎样才能只加载一次url并保持相同的最终结果?

我希望我的英语很清楚,所以我的问题。

问候。

谢谢。

回答

1

什么Keppil回答是正确的,但你必须使用Set到位tabUrlSource的[I],而不是为Set<HtmlElement>

编辑: 好什么是tabUrlSource [I]的内容是不是类型的?网址或自定义? 这是它会是什么样子,如果它是URL

Set <URL>uniqueURLs = new HashSet <URL>(); 

    for (int i = 0; i < tableUrlSource.length; i++) { 
    uniqueURLs.add(tableUrlSource[i]) 
    } 

然后遍历这个设置的,而不是tableUrlSource阵列这样

for(Iterator itr = uniqueURLs.iterator(); itr.hasNext(); ){ 
    page = webClient.getPage((URL)itr.next()); 
    ............. 
    ............. 

继续执行代码的其余部分

你也说你正在使用index'i'关联url和xpath。那个xpath对于同一个url是否相同?如果是这样,你可以使用HashMap而不是key作为URL和value作为xpath,这样重复的键将被覆盖。然后,你可以在此HashMap键重复,以获得“页”,并使用“值”为获取HTML元素

如果它们不一样,你仍然可以使用一个HashSet这样

Set <URL>uniqueURLs = new HashSet <URL>(); 
     HtmlPage page=null; 


    for (int i = 0; i < tableUrlSource.length; i++) { 
    try {  
      if(uniqueURLs.contains(tabUrlSource[i]) continue; 
      else 
      uniqueURLs.add(tabUrlSource[i]); 
      page = webClient.getPage(tabUrlSource[i]); 
      List<HtmlElement> nbElements = (List<HtmlElement>) 
      page.getByXPath(tabXpathSource[i]); 
      if (null != nbElements && !nbElements.isEmpty()) { 
       htmlResult = nbElements.get(0).asText(); 

} 

希望这帮助:)

+0

是的,但如果你知道这种方式,你能解释更多吗?无需为htmlelement更改,但如果您可以解释为url ^^ – 2012-07-18 08:26:50

+0

编辑答案并提供了一些代码。希望有所帮助:) – 2012-07-18 09:17:37

+0

比你,我会试试这个。 _italic_Okay tabUrlSource [i]的内容是什么?它是URL还是自定义类型?这是它的样子,如果它是URL_italic_ 这是一个字符串表,但是你的代码似乎很好。谢谢 – 2012-07-18 09:46:55

1

您可以使用Set<HtmlElement>而不是List。这将自动删除重复项。

这当然取决于HtmlElement是可比的事实。如果不是,则可以将所有网址添加到Set<String>,然后对其进行迭代。

更新

要澄清的第二部分:

一个Set声明像这样的Javadoc:

不包含重复元素的集合。更正式地说,集合 不包含元素对e1和e2,使得e1.equals(e2)和 中最多一个为null元素。正如其名称所暗示的那样,该接口模型 是数学集抽象。

换句话说,为了确保没有重复,它依靠可通过equals()方法进行比较的元素。如果HtmlElement尚未覆盖此方法,Set将只使用Object.equals()方法,该方法仅比较对象引用而不是HtmlElements中的实际数据。

然而,String已经覆盖了equals()方法,你可以为此肯定,重复String旨意从Set<String>被删除。

+0

“您可以使用Set 而不是List,这将自动删除重复项。”无需对此进行修改。 你能解释第二部分更多吗? – 2012-07-18 08:19:07

+0

@Jean:更新了更全面的解释。 – Keppil 2012-07-18 08:29:50

+0

不确定是否可以使用我的代码;我有一个url表和一个xpath关联表。而且两者都使用我来关联。使用循环。该表需要具有所有网址,甚至是重复的网址,但我不明白,如何应用您的方法。我很困惑。添加更多代码。 – 2012-07-18 08:42:28