仅加载一次网址

时间:2012-07-18 08:02:42

标签: java spring-mvc

我有一个我要加载的网址表,该表可以有一个或多个时间的网址。

例如,一个包含三个值的表: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一次。 所以它会加载三个网址,然后让治疗时间更长。

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

我希望我的英语很清楚,所以我的问题也是如此。

问候。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

更新

澄清第二部分:

在Javadocs中声明Set

  

不包含重复元素的集合。更正式的,集合   不包含元素e1和e2对,使得e1.equals(e2)和at   大多数一个null元素。正如其名称所暗示的,这个界面模型   数学集抽象。

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

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

答案 1 :(得分:1)

Keppil回答的是正确的,但您必须使用Set替代tabUrlSource [i]而不是Set<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。相同网址的xpath是否相同?如果是这样,您可以使用HashMap,而使用key作为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();

}

希望这会有所帮助:)