Java 创建唯一对象的列表

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

我通过解析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方法。