Java 只加载一次url
我有一个要加载的url表,该表可以有一个或多个url 例如,有三个值的表:url1、url2、url1 所以,之后,我加载一个url,一个他的html片段的摘录(例如a) 我有这个: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]);
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。