【问题标题】:Remove duplicate object from list wihout overriding equals and hashcode method in class [duplicate]从列表中删除重复对象而不覆盖类中的等于和哈希码方法[重复]
【发布时间】:2017-04-04 09:40:45
【问题描述】:
 List<Action> action = noDuplicate Object();
 List<Action> actions = duplicate Object();

我想同时添加列表并且只有不同的对象?请问有什么建议吗?请不要使用覆盖 equals 和 hashcode() 方法,因为我无法放置,因为它是由 JAXB 生成的。

【问题讨论】:

  • 如果不等于,则定义哈希码 jvm如何知道元素是否为dupos?
  • 你在谈论元素......对于元素我们需要实现equals()和hashcode()方法,在我的场景中我不能使用Action类的equals方法,因为它是从生成的JAXB xjc。
  • so no 等于 no hashcode no wrappers.... 你确定要实现什么目标吗?
  • :) 我知道...Maxim 帮助解决我的问题..感谢您的回答

标签: java jaxb


【解决方案1】:

您可以执行以下操作。

  1. 创建新的包装类

    类 ActionWrapper { 私人行动行动; //此处基于操作字段的等于和哈希码 }

  2. 使用 Set 而不是 List

  3. 最后将集合转换成这样的列表actionWrappers.stream().map((s) -&gt; s.getAction()).collect(Collectors.toList())

【讨论】:

  • 感谢您的建议...我们可以在不使用包装类的情况下获得任何答案吗?请?
  • 不幸的是,不清楚您打算如何确定重复的对象。假设您在 Action 类 String name、Date dateCreated 中有以下字段。只有当 name1 == name2 和 date1 == date2 时,action 才等于另一个。让我们创建一个地图 Map,其中键 = 名称 + 日期。因此,您只需将类似 map.put(action.name + action.dateCreated, action) 的操作放入地图中,然后获取唯一值 new ArrayList(map.values())
  • 感谢马克西姆的建议..
【解决方案2】:

您可以向后迭代列表,然后检查每个项目是否在剩余列表中找到重复项:如果发现重复项,请删除当前项目并继续。

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

    @Test
    public void listDedup() throws Exception {
        List<String> duplicates = new ArrayList<>();
        duplicates.add("a");
        duplicates.add("a");
        duplicates.add("A");
        duplicates.add("b");
        Assert.assertEquals(4, duplicates.size());

        /* iterate backwards, so that we can safely remove items 
         * from the list that we are iterating over 
         */
        for (int i = duplicates.size() - 1; i >= 0; i--) {
            String item = duplicates.get(i);
            // now check the remaining items in the list for duplicates
            for (int j = i - 1; j >= 0; j--) {
                String possibleDuplicate = duplicates.get(j);
                // check for equality: use any comparison operation you like
                if (item.equalsIgnoreCase(possibleDuplicate)) {
                    // this is a duplicate - remove it
                    duplicates.remove(i);
                    // break the inner loop because we already have a duplicate
                    break;  
                }
            }
        }
        // only "a" and "b" reamin in the list
        Assert.assertEquals(2, duplicates.size());
        Assert.assertEquals("a", duplicates.get(0));
        Assert.assertEquals("b", duplicates.get(1));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2017-06-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多