删除ArrayList <searchresults>中的重复项

时间:2016-01-16 16:27:55

标签: java arraylist

我有一个POJO类SearchResults,它包含4个字符串(标题,数字,日期,状态),然后是所有getter和setter方法。

在另一个类中,我填充ArrayList<SearchResults> results,有没有办法可以浏览列表results并删除任何重复数字的元素?

我已经尝试通过首先将results传递给LinkedHashSet来填充新的ArrayList,但这不起作用。

 ArrayList<SearchResults> noDup;

 noDup = new ArrayList<SearchResults>(new LinkedHashSet<SearchResults>(results));

我也尝试过.remove(indexof()),但这也不起作用。

if(noDup.contains(new SearchResults("-1","","",""))){noDup.remove(noDup.indexOf(new SearchResults("-1","","","")));}

有什么建议吗?

编辑:  SearchResults中的equals()方法(wonr指的是数字)

    @Override
public boolean equals(Object object){
    if(object == null){
        return false;
    }
    if(getClass() != object.getClass()){
        return false;
    }
    SearchResults result = (SearchResults) object;
    if((this.wonr == null) ? (result.wonr == null): this.wonr.equals(result.wonr)){
        return false;
    }
    return true;
}

4 个答案:

答案 0 :(得分:5)

实现hashCode和equals的建议是可能的选项,但这个单个数值真正是否定义了这些对象在一般情况下的等价意义?如果没有,那么定义equals和hashCode似乎是一种破解。

如果不改变等价的定义,如果在只是这种情况下你想要消除具有相同数值的值,那么你可以尝试其他方法。您没有向我们提供SearchResult课程的API,因此我假设有一个名为number的可访问字段。

一种快速方法是使用TreeSet,它基于底层的比较操作定义其等价的概念。写一个只查看数字字段的自定义Comparator,你就可以了:

Java 8

List<SearchResult> allResultsWithDuplicates = // ... populated list
Comparator<SearchResult> comparator =
    (left, right) -> Integer.compare(left.number, right.number);
Set<SearchResult> uniqueNumbers = new TreeSet<>(comparator);
uniqueNumbers.addAll(allResultsWithDuplicates);

正如JB Nizet所提到的,如果您的SearchResult类具有getNumber访问器方法,您可以使用函数引用并消除定义Comparator的lambda表达式:

Comparator<SearchReult> comparator = Comparator.comparing(SearchResult::getNumber);

Java 5-7

在早期版本的Java中,您必须自己实现Comparator类。然后它以完全相同的方式插入上面给出的代码。此示例假定您的SearchResult类有一个int getNumber()访问器方法:

Comparator<SearchResult> comparator = 
    new Comparator<SearchResult>() {
        @Override
        public int compare(SearchResult sr1, SearchResult sr2) {
            // Optional support for null arguments is left as
            // an exercise for the reader.
            return Integer.compare(sr1.getNumber(), sr2.getNumber());
        }
    };

答案 1 :(得分:1)

使用 Java-8 执行此操作的另一种方法是这样:

1)创建一组唯一数字,

2)对列表进行迭代并按此集过滤:

    Set<Integer> numbers = new HashSet<>();
    List<SearchResult> noDups = listWithDups.stream()
            .filter(sr -> numbers.add(sr.getNumber()))
            .collect(Collectors.toList());

答案 2 :(得分:-2)

如果您实施了equals()hashCode(),那么他们只需查看Number属性即可构建Set<SearchResult>而不是ArrayList<SearchResult>,您将隐式地得到没有重复(这是集的属性之一 - 它们不包含重复项)。您仍然可以迭代集合中的条目,这样您就可以拥有所需的所有功能。

答案 3 :(得分:-3)

执行列表流并使用过滤方法并收集到其他列表。