java - 删除 ArrayList<SearchResults> 中的重复项

标签 java arraylist

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

在另一个类(class)中,我填充了 ArrayList<SearchResults> results ,有什么办法可以让我浏览该列表 results并删除任何具有重复编号的元素?

我尝试通过首先传递 results 来填充新的 ArrayList进入 LinkedHashSet 但这不起作用。

 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;
}

最佳答案

实现 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());
        }
    };

关于java - 删除 ArrayList<SearchResults> 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34829262/

相关文章:

java - Thymeleaf - 枚举值无法绑定(bind)

java - 在 Android 中捕获 printStackTrace() 输出

java - 方法中arraylist的arraylist

java - 如何重写这3个方法以使其可重用?

java - 不同的java版本在一台电脑上使用java web start

java - 通过 Java 运行时进程连接到 SFTP 服务

java - 如何解决Android中的Array IndexOutOfBoundException

java - 如何从我的 carList 中获取总价?

java - 按存在于另一个数组列表中的 ListView 排序

java - Tomcat - 无法打开日志 - 无法部署