0

我有一个要加载的 url 表,该表可以有一个或多个时间的 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 来加载,然后,使处理时间更长。

如何只加载一次 url 并保持相同的最终结果?

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

问候。

谢谢你。

4

2 回答 2

1

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

这当然取决于HtmlElements 具有可比性这一事实。如果不是,您可以改为将所有 URL 添加到 a 中Set<String>,然后对其进行迭代。

更新

澄清第二部分:

ASet在 Javadocs 中是这样声明的:

不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如它的名字所暗示的,这个接口模拟了数学集合抽象。

换句话说,为了确保没有重复,它依赖于通过该equals()方法可比较的元素。如果HtmlElement没有重写此方法,Set则将仅使用该Object.equals()方法,该方法仅比较对象引用而不是HtmlElements.

但是,String已经覆盖了该equals()方法,因此您可以确定重复String的 s 将从 a 中删除Set<String>

于 2012-07-18T08:08:05.000 回答
1

Keppil 的回答是正确的,但您必须使用 Set 代替 tabUrlSource[i] 而不是 forSet<HtmlElement>

编辑:好的,tabUrlSource[i] 的内容是什么?它是 URL 类型还是自定义类型?如果它是 URL,这就是它的样子

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

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

然后像这样迭代这个 Set 而不是 tableUrlSource 数组

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

继续剩下的代码

您还说您正在使用索引“i”来关联 url 和 xpath。对于相同的 url,xpath 是否相同?如果是这样,您可以使用 HashMap 而不是将键作为 URL,将值作为 xpath,以便覆盖重复的键。然后你可以遍历这个 hashmap 键来获取'page'并使用'value'来获取 HTMLELEMENT

如果它们不相同,您仍然可以使用这样的 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();

}

希望这可以帮助 :)

于 2012-07-18T08:19:45.927 回答