Java 创建唯一对象的列表
我通过解析html文档获得一组元素。元素可能包含重复项。仅列出唯一元素的最佳方式是什么Java 创建唯一对象的列表,java,collections,set,Java,Collections,Set,我通过解析html文档获得一组元素。元素可能包含重复项。仅列出唯一元素的最佳方式是什么 我来自C++背景,并看到使用集合和自定义相等操作的可能性。但是,我不知道如何在Java中实现它。感谢任何能帮助我正确有效地完成任务的代码 ArrayList<Element> values = new ArrayList<Element>(); // Parse the html and get the document Document doc = Jsoup.parse(html
我来自C++背景,并看到使用集合和自定义相等操作的可能性。但是,我不知道如何在Java中实现它。感谢任何能帮助我正确有效地完成任务的代码
ArrayList<Element> values = new ArrayList<Element>();
// Parse the html and get the document
Document doc = Jsoup.parse(htmlDataInStringFormat);
// Go through each selector and find all matching elements
for ( String selector: selectors ) {
//Find elements matching this selector
Elements elements = doc.select(selector);
//If there are no matching elements, proceed to next selector
if ( 0 == elements.size() ) continue;
for (Element elem: elements ){
values.add(elem);
}
}
if ( elements.size() > 0 ) {
????? // Need to remove duplicates here
}
ArrayList值=新的ArrayList();
//解析html并获取文档
Document doc=Jsoup.parse(htmlDataInStringFormat);
//检查每个选择器并找到所有匹配的元素
用于(字符串选择器:选择器){
//查找与此选择器匹配的元素
元素=单据选择(选择器);
//如果没有匹配的元素,请转至下一个选择器
如果(0==elements.size())继续;
用于(元素元素:元素){
添加(elem);
}
}
if(elements.size()>0){
??????//需要在此处删除重复项
}
java.util.HashSet
将为您提供一个无序集API中还有其他java.util.set
的扩展,将为您提供有序集或并发行为(如果需要)
根据类元素是什么,您可能还需要在其上实现equals和hashCode函数。根据@music_coder的评论
例如:
把它传给片场,好吧,现在我希望这门课不是期末考试。有效地包装这个类中的所有元素。Ah ElementWrapper这是一个更好的名称。
java.util.HashSet
将为您提供一个无序集。API中还有java.util.set
的其他扩展,可以根据需要提供有序集或并发行为
根据类元素是什么,您可能还需要在其上实现equals和hashCode函数。根据@music_coder的评论
例如:
把它传给片场,好吧,现在我希望这门课不是期末考试。有效地包装这个类中的所有元素。啊ElementWrapper,这是一个更好的名称。将元素添加到
java.util.HashSet
中,它将只包含唯一的元素。将元素添加到java.util.HashSet
中,它将只包含唯一的元素。如果您只是想避免重复,请使用HashSet。如果您想要排序并避免重复,请使用树集如果您只想避免重复,请使用哈希集。如果您希望排序并避免重复,请使用树集另外覆盖元素的equals和hashCode方法
class Element {
...
public boolean equals(Object o) {
if (! (o instanceof Element)) {
return false;
}
Element other = (Element)o;
//compare the elements of this and o like
if (o.a != this.a) { return false;}
...
}
...
public int hashCode() {
//compute a value that is will return equal hash code for equal objects
}
}
另外重写元素的equals和hashCode方法
class Element {
...
public boolean equals(Object o) {
if (! (o instanceof Element)) {
return false;
}
Element other = (Element)o;
//compare the elements of this and o like
if (o.a != this.a) { return false;}
...
}
...
public int hashCode() {
//compute a value that is will return equal hash code for equal objects
}
}
如果有可能修改元素的话,这些答案会起作用,但我不能这样做。我不需要排序集,因此这里是我找到的解决方案
TreeSet<Element> nt = new TreeSet<Element>(new Comparator<Element>(){
public int compare(Element a, Element b){
if ( a == b )
return 0;
if ( (a.val - b.val) > 0 )
return 1;
return -1;
}
});
for (Element elem: elements ){
nt.add(elem);
}
TreeSet nt=新树集(新比较器(){
公共整数比较(元素a、元素b){
如果(a==b)
返回0;
如果((a.val-b.val)>0)
返回1;
返回-1;
}
});
用于(元素元素:元素){
新界增补(elem);
}
如果有可能修改元素,则发布的答案有效,但我不能这样做。我不需要排序集,因此这里是我找到的解决方案
TreeSet<Element> nt = new TreeSet<Element>(new Comparator<Element>(){
public int compare(Element a, Element b){
if ( a == b )
return 0;
if ( (a.val - b.val) > 0 )
return 1;
return -1;
}
});
for (Element elem: elements ){
nt.add(elem);
}
TreeSet nt=新树集(新比较器(){
公共整数比较(元素a、元素b){
如果(a==b)
返回0;
如果((a.val-b.val)>0)
返回1;
返回-1;
}
});
用于(元素元素:元素){
新界增补(elem);
}
发布的解决方案将起作用,但前提是您为class元素重写equals()和hashCode()。发布的解决方案将起作用,但前提是您为class元素.Thx重写equals()和hashCode()。。如果我直接将它们添加到一个集合中,它会起作用吗?比如:Set values=newhashset()代码>而不是将元素移动到SET中?@ Kiran可能是,取决于您打算使用它的其他内容,您可能希望考虑替代代码<代码>树目录 > MSach建议,如果排序顺序对您很重要,它们是(Inc. <代码>列表< /代码>)所有<代码>集合< /代码> s,因此您可以以相同的方式重复它们。谢谢…我不需要排序顺序,只需要避免重复。事实上,我需要避免分类。将坚持使用Hashset。有没有办法提供自定义比较器?我无权访问element类来更改equals方法:(@Kiran类是否需要一个与它已经实现的不同的equals?我不知道lib是否已经存在。但是没有默认的HashSet不允许您替换equals方法。Thx..如果我直接将它们添加到一个集合中,它会工作吗?例如:set values=new HashSet()“<代码> >而不是将元素移动到SET中?@ Kiran可能是,取决于您打算使用它的其他内容,您可能希望考虑替代代码<代码> TeSeSe<代码>,如MSach建议的,如果排序顺序对您很重要,则它们是(Inc.代码>列表< /代码>)所有Collection
s,这样您就可以以相同的方式迭代它们。谢谢..我不需要排序顺序,只需要避免重复。事实上,我需要避免排序。将继续使用Hashset..有没有办法提供自定义比较器?我没有访问元素类的权限来更改equals方法:(@Kiran类是否需要一个与它已经实现的不同的equals?我不知道lib是否已经有了。但是没有默认的HashSet不允许您替换equals方法。