这是我的要求之一。我无法发布超过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。 任何线索...
答案 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