如何删除列表中另一个列表中不可用的数据

时间:2018-05-22 16:49:11

标签: java

这是我的要求之一。我无法发布超过1000行代码的所有bean文件。所以,我只是发布了完全复制我的问题的示例程序。

我的POJO课程如下所示:

  public class TestDTO {

    private String one;

    private String two;

    private String three;

    public String getOne() 
    {
        return one;
    }
    public void setOne(String one) 
    {
        this.one = one;
    }
    public String getTwo() 
    {
        return two;
    }
    public void setTwo(String two) 
    {
        this.two = two;
    }
    public String getThree() 
    {
        return three;
    }
    public void setThree(String three) 
    {
        this.three = three;
    }

我有一个下面的main方法,它将值设置为POJO类并将所有类对象存储到List中,如下所示:

 public static void main(String args[]) throws Exception 
   {
        TestDTO dto = new TestDTO();
        dto.setOne("one");
        dto.setTwo("two");
        dto.setThree("three");

        TestDTO dto1 = new TestDTO();
        dto1.setOne("one1");
        dto1.setTwo("two1");
        dto1.setThree("three1");

        TestDTO dto2 = new TestDTO();
        dto2.setOne("one2");
        dto2.setTwo("two2");
        dto2.setThree("three2");

        List<TestDTO> test = new ArrayList<TestDTO>();
        test.add(dto);
        test.add(dto1);
        test.add(dto2);

        List<String> duplicate = new ArrayList<String>();
        duplicate.add("one1");
        duplicate.add("one");

        System.out.println(test.size() + "\t before");

        for (int i = 0; i < duplicate.size(); i++) {
            for (int j = 0; j < test.size(); j++) {
                if (!(test.get(j).getOne().contains(duplicate.get(i)))) {
                    System.out.println(test.get(j).getOne());
                    test.remove(j);
                }
            }
        }

        System.out.println(test.size() + "\t after");

        for (int i = 0; i < test.size(); i++) {
            System.out.println(test.get(i).getOne());
            System.out.println(test.get(i).getTwo());
            System.out.println(test.get(i).getThree());
        }

    }

上面的代码我有一个List <String>,它有一些值。我只需要删除List <TestDTO>List <String>中没有的?中的值。在上面的代码中,我的预期结果是一个,one1在List中可用,因此如果这些值在&#34; dto&#34;和&#34; dto1&#34;中可用。那些应该仍然存在于&#34;测试&#34;名单。单独和dto2需要删除。

另外,我使用的是JAVA 7。 任何线索...

3 个答案:

答案 0 :(得分:3)

retainAll java.util.List.retainAll(java.util.Collection) - 仅保留此列表中包含在指定集合中的元素(可选操作)。换句话说,从该列表中删除未包含在指定集合中的所有元素。

答案 1 :(得分:1)

首先,将重复的字符串准备为Set,以便更快地进行contains检查:

 Set<String> duplicate = new HashSet<String>();

然后遍历您的列表并过滤掉重复的内容:

 List<TestDTO> result = test.stream()
        .filter(t -> !duplicate.contains(t.getOne()))
        .collect(Collectors.toList());

对于java 7:

List<TestDTO> result = new ArrayList<>();
for (TestDTO t : test) {
    if (!duplicate.contains(t.getOne())) {
        result.add(t);
    }
}
// Result contains all `TestDTO` which is not in `duplicate`

答案 2 :(得分:1)

实际上您要删除TestDTO对象,因为您在TestDto.getOne()和字符串重复列表的任何元素之间找不到任何匹配。
但你所做的实际上是一个逻辑错误:

  • 您不必迭代所有TestDTO个对象,然后再决定匹配是否正确。第一个可能不包含,但第二个可以 现在为时已晚:您已将其删除了!

  • 您使用String.contains()代替List.contains()(可能是第一点的原因)。

所以我建议你使用迭代器(删除迭代列表的当前元素的简单方法)并在删除条件中进行反转。

这:

if (!(test.get(j).getOne().contains(duplicate.get(i)))) {

应该是:

if (!(duplicate.contains(test.get(j).getOne()))) {

它会给:

for (Iterator<TestDTO> it = test.iterator(); it.hasNext();) {
    TestDTO currentTestDTO = it.next();
    if (!(duplicate.contains(currentTestDTO.getOne()))) {
        System.out.println(currentTestDTO.getOne());
        it.remove();
    }
}

按预期输出:

  

之前

     

one2&lt; - 只删除one2

     

之后

2      

一个

     

2

     

3

     

one1

     

two1

     

three1