我有一个我要加载的网址表,该表可以有一个或多个时间的网址。
例如,一个包含三个值的表: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一次。 所以它会加载三个网址,然后让治疗时间更长。
如何只加载一次网址并保持相同的最终结果?
我希望我的英语很清楚,所以我的问题也是如此。
问候。
谢谢。
答案 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();
}
希望这会有所帮助:)