删除ArrayList <SearchResults>中的重复项

Joh*_*ohn 1 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));
Run Code Online (Sandbox Code Playgroud)

我也试过做了.remove(indexof())但是那也没用.

if(noDup.contains(new SearchResults("-1","","",""))){noDup.remove(noDup.indexOf(new SearchResults("-1","","","")));}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑: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;
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*ice 5

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

在不改变等价定义的情况下,如果这种情况下您希望使用相同的数值值消除值,则可以尝试其他方法.您没有为我们的SearchResult类提供API ,因此我假设有一个名为的可访问字段number.

一种快速方法是使用a 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);
Run Code Online (Sandbox Code Playgroud)

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

Comparator<SearchReult> comparator = Comparator.comparing(SearchResult::getNumber);
Run Code Online (Sandbox Code Playgroud)

Java 5-7

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

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());
        }
    };
Run Code Online (Sandbox Code Playgroud)