只加载一次网址一次
我有一个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并保持相同的最终结果?
我希望我的英语很清楚,所以我的问题。
问候。
谢谢。
什么Keppil回答是正确的,但你必须使用Set到位tabUrlSource的[I],而不是为Set<HtmlElement>
编辑: 好什么是tabUrlSource [I]的内容是不是类型的?网址或自定义? 这是它会是什么样子,如果它是URL
Set <URL>uniqueURLs = new HashSet <URL>();
for (int i = 0; i < tableUrlSource.length; i++) {
uniqueURLs.add(tableUrlSource[i])
}
然后遍历这个设置的,而不是tableUrlSource阵列这样
for(Iterator itr = uniqueURLs.iterator(); itr.hasNext(); ){
page = webClient.getPage((URL)itr.next());
.............
.............
继续执行代码的其余部分
你也说你正在使用index'i'关联url和xpath。那个xpath对于同一个url是否相同?如果是这样,你可以使用HashMap而不是key作为URL和value作为xpath,这样重复的键将被覆盖。然后,你可以在此HashMap键重复,以获得“页”,并使用“值”为获取HTML元素
如果它们不一样,你仍然可以使用一个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();
}
希望这帮助:)
您可以使用Set<HtmlElement>
而不是List
。这将自动删除重复项。
这当然取决于HtmlElement
是可比的事实。如果不是,则可以将所有网址添加到Set<String>
,然后对其进行迭代。
更新
要澄清的第二部分:
一个Set
声明像这样的Javadoc:
不包含重复元素的集合。更正式地说,集合 不包含元素对e1和e2,使得e1.equals(e2)和 中最多一个为null元素。正如其名称所暗示的那样,该接口模型 是数学集抽象。
换句话说,为了确保没有重复,它依靠可通过equals()
方法进行比较的元素。如果HtmlElement
尚未覆盖此方法,Set
将只使用Object.equals()
方法,该方法仅比较对象引用而不是HtmlElements
中的实际数据。
然而,String
已经覆盖了equals()
方法,你可以为此肯定,重复String
旨意从Set<String>
被删除。
“您可以使用Set
@Jean:更新了更全面的解释。 – Keppil 2012-07-18 08:29:50
不确定是否可以使用我的代码;我有一个url表和一个xpath关联表。而且两者都使用我来关联。使用循环。该表需要具有所有网址,甚至是重复的网址,但我不明白,如何应用您的方法。我很困惑。添加更多代码。 – 2012-07-18 08:42:28
是的,但如果你知道这种方式,你能解释更多吗?无需为htmlelement更改,但如果您可以解释为url ^^ – 2012-07-18 08:26:50
编辑答案并提供了一些代码。希望有所帮助:) – 2012-07-18 09:17:37
比你,我会试试这个。 _italic_Okay tabUrlSource [i]的内容是什么?它是URL还是自定义类型?这是它的样子,如果它是URL_italic_ 这是一个字符串表,但是你的代码似乎很好。谢谢 – 2012-07-18 09:46:55