从列表中删除重复的对象,而不覆盖类中的等于和哈希码方法


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

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

您可以执行以下操作。

  1. 创建新的包装类

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

  2. 使用"设置"而不是"列表

  3. ">
  4. 最后转换设置为列出类似以下内容actionWrappers.stream().map((s) -> s.getAction()).collect(Collectors.toList())

您可以向后循环访问列表,然后在其余列表中找到重复项,然后检查每个项目: 如果发现重复项,请删除当前项并继续。

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

最新更新