从列表中删除重复对象,而不是覆盖类中的equals和hashcode方法

时间:2017-04-04 09:40:46

标签: java jaxb

 List<Action> action = noDuplicate Object();
 List<Action> actions = duplicate Object();

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

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作。

  1. 创建新的包装类

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

  2. 使用Set而不是List

  3. 最后将set设置为list actionWrappers.stream().map((s) -> s.getAction()).collect(Collectors.toList())

答案 1 :(得分:0)

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

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