2016-11-21 143 views
0

对Java来说是全新的,我试图从一个数组中找到匹配的元素到另一个数组中,似乎无法理解如何去做。下面是数据是如何和多远我已经得到的样品:在数组中找到匹配元素

在该代码和打印该行后,这是数据是如何:

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

结果数组1:

从Array 2
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); 

结果:这里

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。 感谢您的期待!

+0

可能重复[如何测试数组是否包含某个值?](http://stackoverflow.com/questions/1128723/how-can-i-test-if-an-array-contains-a -ertain-value) –

+0

@PeterPerháč问题是完全不同的,在这里OP要求数组包含多于一个元素而不仅一个。 – user6904265

+0

@ user6904265我坚持认为这个问题已经在这里得到了肯定的回答,OP可以弄清楚如何看待我链接的其他问题。这是“做我的作业”类问题,不应该在这里 –

回答

0

只需添加一个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); 

    } 
    } 
} 
+0

我想这样,我仍然不明白为什么它不匹配: \t String found = null; \t为(字符串帐户:all_accounts){ \t \t 为\t(字符串取消:cancel_accounts){ \t \t的System.out.println(取消); \t \t找到=取消; \t \t} \t \t System.out.println(found); \t \t if(account.equals(found)){System.out.println(account); \t} \t \t \t} – Andre

+0

EXACTLY尝试,因为上面的答案 - 和手表,你把大括号。你在上面的评论中粘贴的是一个严重的逻辑错误。 – C0D3LIC1OU5

+0

我认为问题在于所有数据都是一次一个元素,就像上面的数据样本一样,这就是为什么我找不到匹配。 – Andre

0

你可以通过一个列表循环和搜索第二列表中的第一个每个元素。

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

只需注意,如果值是'primitive'类型,则'List#contains'方法将不起作用。尽管应该使用'String'。 – C0D3LIC1OU5

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

+1回答user6904265

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

+0

我用你的提示更新了我的答案。但是如果你不想在最终数组中使用重复值(如果输入数组包含任何值),你应该使用'Set'。 ;) – user6904265

相关问题