嵌套for循环中的字符串匹配

时间:2017-02-16 12:35:53

标签: java

假设我有两种不同的给定pojo类型的字符串。

 List 1 = "one", "two", "three", "four", "five".
 List 2 = "one", "two", "four", "five".

我想检索一个在另一个列表中找不到的字符串,并将其添加到另一个列表中(比如列表3)。 我怎么能这样做?

我正在尝试这个: -

 for ( SettlementReportNB showSellementReport : settlementReportList )
        {
            String merchantreferencenumber = showSellementReport.getMerchantreferencenumber();
            for ( AllTransactions showAllTransaction : allTransactionsList )
            {
                String merchantTxnId = showAllTransaction.getMerchantTxnId();
                if ( !merchantreferencenumber.equals( merchantTxnId ) )
                {
                    idNotFound.add( merchantTxnId );
                }
            }
        }

但它没有给我一个预期的答案。

  • 答案应为“3”,因为它不在另一个列表中。

7 个答案:

答案 0 :(得分:2)

您要过早地将字符串添加到结果中。在调用idNotFound.add();

之前,您的代码必须等待循环完成

定义boolean变量notFound,并在循环前将其设置为true。如果在循环中找到匹配项,请将变量设置为false,然后退出循环。

如果循环结束后变量仍为true,请致电idNotFound.add();

答案 1 :(得分:1)

或者你可以这样:

List list1 = Arrays.asList("one", "two", "three", "four", "five");
List list2 = Arrays.asList("one", "two", "four", "five");

//create a clone of list1
List list3 = new ArrayList<>(list1);

//remove all elements of list2 from list1
list3.removeAll(list2);

//output : [three]
System.out.print(list3);

你最终将只有[三]

的list3

或尝试这样的方法来保留现有代码:

for ( SettlementReportNB showSellementReport : settlementReportList ) {

    String allTransactionsList = showSellementReport.getMerchantreferencenumber();

    if ( isNotContain(allTransactionsList, allTransactionsList))
    {
        idNotFound.add( merchantTxnId );
    }

}

private boolean isNotContain(List allTransactionsList, String merchantreferencenumber) {

    for ( AllTransactions showAllTransaction : allTransactionsList )
    {
        String merchantTxnId = showAllTransaction.getMerchantTxnId();
        if ( merchantreferencenumber.equals( merchantTxnId ) )
        {
            return false;
        }
    }

    return true;
}

答案 2 :(得分:0)

你的第二个for循环不检查每个元素。它仅检查一个元素是否与比较的combo()不匹配。在确定它不存在之前,你必须遍历整个列表,例如。

String

或者您可以使用List.util函数的任何其他答案

答案 3 :(得分:0)

可能是这种情况

        List<String> a1 = new ArrayList<>(Arrays.asList( "one", "two", "three", "four", "five"));
        List<String> a2 = new ArrayList<>(Arrays.asList( "one", "two", "four", "five"));

        Set<String> s1 = new HashSet<>(a1);
        Set<String> s2 = new HashSet<>(a2);

        s2.removeAll(s1);

        List<String> a3 = new ArrayList<>(s2);

        List<String> result =  new ArrayList<>(Arrays.asList( "six"));
        result.addAll(a3);

答案 4 :(得分:0)

如果您使用的是Java 8,那么使用 Lambdas - 它会更快,并且可以为您节省一个循环。

答案 5 :(得分:0)

如果您需要验证第二个列表中不存在的所有元素,只需创建一个Set并使用第一个列表中的!contains,如果您需要验证这两个列表,那么从示例中添加第二个下面:

Set<String> list3 = new HashSet<String>();
for (String text : list1) {
  if (!list2.contains(text)) list3.add(text);
}
for (String text : list2) {
  if (!list1.contains(text)) list3.add(text);
}

答案 6 :(得分:0)

List a = new ArrayList(asList("one", "two", "three", "four", "five"));
List b = new ArrayList(asList("one", "two", "four", "five"));
List c = new ArrayList();
c.addAll(a);
c.addAll(b);
c.removeIf(o -> a.contains(o) && b.contains(o));