2016-11-21 3 views
0

komplett neu in Java, ich versuche das übereinstimmende Element von einem Array in ein anderes finden, scheint nicht zu verstehen, wie es geht. Hier ist ein Beispiel dafür, wie die Daten und wie weit habe ich bekommen:Finden Sie ein Match-Element in Array

In diesem Code und nach dieser Zeile gedruckt wird, das ist, wie die Daten:

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

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

Ergebnisse von Array 2:

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

Stapel hier, ich kann immer noch nicht verstehen, warum es nicht übereinstimmt:

Ich muss in diesem Fall das angepasste Element finden, 77737320. Danke fürs schauen!

+0

Mögliches Duplikat von [Wie kann ich testen, ob ein Array einen bestimmten Wert enthält?] (Http://stackoverflow.com/questions/1128723/how-can-i-test-if-an-array-contains-a- -certain-value) –

+0

@ PeterPerháč Die Frage ist ganz anders, hier fragt das OP nach Arrays, die mehr als ein Element enthalten, nicht nur eins. – user6904265

+0

@ user6904265 Ich bestehe darauf, dass diese Frage hier definitiv beantwortet wurde und OP kann herausfinden, wie man es bei der anderen Frage, die ich verlinkt.dies ist "tue meine Hausaufgaben für mich" Art der Frage und sollte nicht hier sein –

Antwort

0

einfach einen equals Scheck an Ihren für hinzufügen - Schleifen (wird auch ohne List#contains Methode funktioniert)

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

Ich versuche so, ich verstehe immer noch nicht, warum es nicht übereinstimmt: \t String gefunden = null; \t für (String Konto: all_accounts) { \t \t \t für (String abgebrochen: cancel_accounts) { \t \t System.out.printin (abgebrochen); \t \t gefunden = abgebrochen; \t \t} \t \t System.out.println (gefunden); \t \t if (account.equals (found)) { System.out.println (Konto); \t} \t \t \t} – Andre

+0

Probieren Sie es genau so, wie die Antwort oben - und sehen, wo Sie geschweifte Klammern setzen. Was Sie in den obigen Kommentar eingefügt haben, hat einen schwerwiegenden logischen Fehler. – C0D3LIC1OU5

+0

Ich denke, das Problem ist, dass alle Daten Element für Element kommen, wie im obigen Beispiel, weshalb ich die Übereinstimmung nicht finden kann. – Andre

0

Sie können die eine Liste Schleife durch und die zweite Liste in dem ersten für jedes Element suchen.

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

Nur eine Anmerkung, wenn der Wert von 'primitiven' Typ ist,' List # contains' Methode wird nicht funktionieren. Sollte allerdings mit einem 'String' arbeiten. – C0D3LIC1OU5

1

Sie könnten dies als Schnittpunkt zwischen den Sätzen implementieren:

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

Oder wie gesagt von kartiks in seinem Kommentar Sie retainAll Methode direkt auf dem all_accounts Array nennen könnte:

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

Achten Sie auf diese Lösung, denn in diesem Fall gilt retainAll direkt auf der ArrayList und ändert sie (wie Sie sehen können, ist das Endergebnis) im all_accounts Array). Außerdem bleiben doppelte Elemente im Ergebnis-Array.

Letzte Implementierung (wenn Sie berechnen Kreuzung wollen und das Ergebnis alles in einer Zeile drucken, auch diese Version Elemente hält duplizieren):

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

+1 für Antwort von user6904265

aber Sie müssen Erstelle kein neues HashSet. Sie können ArrayList.retainAll() verwenden. Wenn Sie die Liste all_accounts bearbeiten möchten, erstellen Sie einen neuen Klon und verwenden Sie diesen stattdessen.

+0

Ich habe meine Antwort mit Ihrem Hinweis aktualisiert. Wenn Sie jedoch keine doppelten Werte (wenn das Eingabearray eine enthält) im endgültigen Array wünschen, sollten Sie 'Set' verwenden. ;) – user6904265

Verwandte Themen