Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 只加载一次url_Java_Spring Mvc - Fatal编程技术网

Java 只加载一次url

Java 只加载一次url,java,spring-mvc,Java,Spring Mvc,我有一个要加载的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]);

我有一个要加载的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();

    }

...
HtmlPage=null;
for(int i=0;i
但这并不是更有效的方法,因为它将加载url1两次,加载url一次。 因此,它会像有三个url加载,然后,使治疗更长

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

我希望我的英语很清楚,我的问题也一样

问候

谢谢。

您可以使用
集合
而不是
列表
。这将自动删除重复项

这当然取决于
HtmlElement
s具有可比性这一事实。如果它们不具有可比性,您可以将所有URL添加到
集合中,然后进行迭代

更新

为了澄清第二部分:

在Javadocs中声明如下:

不包含重复元素的集合。更正式地说,集合 不包含一对元素e1和e2,使得e1.equals(e2)和at 大多数是一个空元素。正如其名称所暗示的,这个接口建模 数学集合抽象

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


但是,
String
已经覆盖了
equals()
方法,因此您可以确定重复的
String
s将从
集合中删除
Keppil回答的是正确的,但是您必须使用集合代替tabUrlSource[i],而不是
集合

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

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

  for (int i = 0; i < tableUrlSource.length; i++) { 
  uniqueURLs.add(tableUrlSource[i])
  }
继续代码的其余部分

您还说您正在使用索引“i”来关联url和xpath。同一url的xpath是否相同?如果是,您可以使用HashMap,将键作为url,将值作为xpath,这样重复的键将被覆盖。然后您可以迭代此HashMap键以获取“页面”,并使用“值”获取HtmleElement

如果它们不相同,您仍然可以使用这样的哈希集

  for(Iterator itr = uniqueURLs.iterator(); itr.hasNext();  ){
   page = webClient.getPage((URL)itr.next());
    .............
    .............
  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();

}
Set uniqueurl=newhashset();
HtmlPage=null;
for(int i=0;i

希望这有帮助:)

“您可以使用集合而不是列表。这将自动删除重复项。”不需要修改。你能为第二部分做更多解释吗?@Jean:更新了一个更详细的解释。不确定我的代码是否可行;我有一个url表和一个xpath associate表。两者都使用I作为关联。使用循环。表需要有所有url,甚至重复的url,我不知道如何应用你的方法。我很困惑。添加更多的代码。是的,但是如果你知道这种方法,你能解释更多吗?不需要更改HTML元素,但是如果你能解释url^^^^^,我会尝试这个。italic_好的tabUrlSource[I]的内容是什么?它是URL类型还是自定义类型?如果它是URL,这是一个字符串表,但您的代码似乎很好。谢谢。我尝试了第二种解决方案,但不起作用。例如,对于链接URL,xpath,我有taburl和tabxpath:url1xpatha/url2xpathb/url1xpathc。所以它需要知道,哪个xpath与哪个URL匹配。所以同一URL的xpath选项卡各不相同?如果要避免为同一URL调用webClient.getPage,可以使用预先填充的HashMap,将“键”作为URL,将值作为xpath数组,然后迭代此键集加载每个页面并加载与此URL对应的xpath。