2017-02-16 3 views
1

Допустим, у меня есть две разные строки заданного типа 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); 
       } 
      } 
     } 

но это не дает мне ожидаемый ответ.

  • Ответ должен быть «три», потому что его нет в другом списке.
+1

что ваш ожидаемый результат и то, что вы получаете сейчас – RamPrakash

+0

ответ должен быть «три» –

+0

ответ здесь выставляет простой способ сделать набор операций над списками HTTP: // StackOverflow ,com/questions/3590677/how-to-do-union-intersect-difference-and-reverse-data-in-java – RubioRic

ответ

2

Вы добавляете строку в результат слишком рано. Ваш код должен ждать цикла, чтобы закончить перед вызовом idNotFound.add();

Определить boolean переменную notFound, и установите его в true перед циклом. Если вы найдете совпадение в цикле, установите переменную в false и выйдете из цикла.

Если переменная остается true после цикла закончится, вызовите idNotFound.add();

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

Вы будете в конечном итоге с песни3, что есть только [три]

Или попробуйте что-то вроде этого, чтобы сохранить существующий код:

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; 
} 
+0

Что делать, если пользователь хочет получить исходное содержимое list1? – RamPrakash

+0

easy check the post еще раз (создать новую копию списка1) –

+0

Проверьте обновление –

0

Ваш второй цикл цикла не проверяет каждый элемент. Он проверяет только, если один элемент не соответствует сравнению String. Вы должны перебирать весь список, прежде чем убедитесь, что он еще не существует, например.

for (SettlementReportNB showSellementReport: settlementReportList) { 

    boolean notPresent = false; 
    String merchantTxnId = null; 
    String merchantreferencenumber = showSellementReport.getMerchantreferencenumber(); 
    for (AllTransactions showAllTransaction: allTransactionsList) { 
     merchantTxnId = showAllTransaction.getMerchantTxnId(); 
     if (merchantreferencenumber.equals(merchantTxnId)) { 
      notPresent = false; 
      break; // get out of loop because it already exists 
     } else { 
      notPresent = true; 
     } 
    } 
    if (notPresent) idNotFound.add(merchantTxnId); 
} 

Или вы можете использовать любого из других ответов с функциями List.util

+0

Спасибо, человек. оно работает. –

+0

@PrinceKumar проблем нет. Если бы этот ответ помог вам, можете ли вы пометить его как принятый PLS? –

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

Если вы используете Java-затем использовать Лямбд - это будет будьте намного быстрее и сохраните цикл.

0

Если вам нужно проверить все элементы, отсутствующие во втором списке, просто создайте Set и используйте! Содержит из первого списка, если вам нужно проверить оба списка, а затем добавить второй для пример ниже:

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); 
} 
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)); 
Смежные вопросы