在数组中查找匹配元素

时间:2016-11-21 19:07:05

标签: java

全新的Java,我试图从一个数组到另一个数组中找到匹配的元素,似乎无法理解如何做到这一点。以下是数据如何以及我获得了多远的示例:

在此代码中以及打印此行之后,数据的方式如下:

ArrayList<String> all_accounts = new ArrayList<String>();
all_accounts.add(acc);
System.out.println("\nArray 1:" + all_accounts);

结果数组1:

Array 1:[77737320]
Array 1:[88405378]
Array 1:[00056893]
Array 1:[10709816]

ArrayList<String> cancel_accounts = new ArrayList<String>();
cancel_accounts.add(cancel_acc);
System.out.println("\nArray 2:" + cancel_accounts);

数组2的结果:

Array 2:[77737320]
Array 2:[]
Array 2:[]
Array 2:[]

在这里堆叠,我仍然无法理解为什么它不匹配:

     String found = null;
     for (String account: all_accounts) {

       for (String canceled: cancel_accounts) {
          System.out.println(canceled);
          found = canceled;
        }
     System.out.println(found);
     if(account.equals(found) ) {
              System.out.println(account);
         }

    }

在这种情况下,我需要找到匹配的元素77737320。 谢谢你的期待!

4 个答案:

答案 0 :(得分:3)

+1来自user6904265的回答

但是,您无需创建新的HashSet。您可以使用ArrayList.retainAll()。如果要维护all_accounts列表,请创建一个新克隆并使用它。

答案 1 :(得分:1)

您可以将其实现为集合之间的交集:

Set<String> set_all_account = new HashSet<String>(all_accounts);
Set<String> set_cancel_accounts = new HashSet<String>(cancel_accounts);
set_all_account.retainAll(set_cancel_accounts);
set_all_account.forEach(x -> System.out.println("Element matched: "+x));

或者如kartiks在评论中所述,您可以直接在retainAll数组上调用all_accounts方法:

all_accounts.retainAll(cancel_accounts);
all_accounts.forEach(x -> System.out.println("matched element: "+x));

请注意此解决方案,因为在这种情况下retainAll直接应用于ArrayList并对其进行修改(因为您可以看到最终结果位于all_accounts数组中)。此外,重复元素仍保留在结果数组中。

最后一次实现(如果你想要计算交集并在一行中打印结果,这个版本也保留了重复的元素):

all_accounts.stream().filter(x -> cancel_accounts.contains(x)).forEach(x -> System.out.println("matched element: "+x)); 

答案 2 :(得分:0)

只需在for-loops中添加equals项检查(即使没有List#contains方法也可以使用)

for(String account: all_accounts) {
    System.out.println(account);

   for(String canceled: cancel_accounts){
     System.out.println(canceled);

     if(account.equals(cancelled)){
         //you've found first intersection, cancelled exists in both
         System.out.println(canceled + " is the same as " + account); 

     }
   }
}

答案 3 :(得分:0)

您可以遍历一个列表并在第一个列表中搜索每个元素。

for (String account: all_accounts) {
    if (cancel_accounts.contains(account) {
        // Match found - do something....
        System.out.println(account);
    }
}