kostenloser Webspace werbefrei: lima-city


Zwei ArrayLists vergleichen

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    n******k

    Hallo,

    folgendes Problem: Es sollen die Inhalte zweier ArrayLists<String> verglichen werden. Die Elemente die nicht in beiden ArrayLists vorkommen, sollen ausgegeben werden.

    Beispiel:
    ArrayList<String> alEins = new ArrayList<String>();
    alEins.add("Eins");
    alEins.add("Zwei");
    alEins.add("Drei");

    ArrayList<String> alZwei = new ArrayList<String>();
    alZwei .add("Eins");
    alZwei .add("Drei");
    alZwei .add("Vier");

    Wie kann ich nun feststellen, das das Element "Zwei" nur in der alEins vorkommt, nicht aber in alZwei und umgekehrt mit dem Element "Vier" aus alZwei?

    Danke im Voraus.
    MfG
    Frank
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Nun du könntest nach jedem Element aus Array 1 in Array 2 suchen und umgekehrt.
  4. Das was du brauchst ist die Methode contains().

    listeA.contains( elementAusListeB ); //true oder false
  5. Autor dieses Themas

    n******k

    Hey, danke euch beiden! Habe vorhin einen kleinen Geistesblitz gehabt und das ganze dann auf die Schnelle mal so gebaut:

    public ArrayList<String> alVergleich(ArrayList<String> alL, ArrayList<String> alR, char lrb) throws Exception {
    		Character.toUpperCase(lrb);
    		switch (lrb) {
    		case 'L': {
    			// Vergleich Links > Rechts (Werte von Links, die in Rechts nicht enthalten sind!)
    			if (alL.size() > 0) {
    				for (int i = 0; i < alL.size(); i++) {
    					if (alR.contains(alL.get(i))) {
    						//System.out.println("[INFO]: Eintrag n 'rechter' ArrayList enthalten: " + alL.get(i));
    					} else {
    						//System.out.println("[INFO]: Eintrag nicht in 'rechter' ArrayList enthalten: " + alL.get(i));
    						alNew.add(alL.get(i));
    					}
    				}
    			}
    			break;
    		}
    		case 'R': {
    			// Vergleich Rechts > Links (Werte von Rechts, die in Links nicht enthalten sind!)
    			if (alR.size() > 0) {
    				for (int i = 0; i < alR.size(); i++) {
    					if (alL.contains(alR.get(i))) {
    						//System.out.println("[INFO]: Eintrag in 'linker' ArrayList enthalten: " + alR.get(i));
    					} else {
    						//System.out.println("[INFO]: Eintrag nicht in 'linker' ArrayList enthalten: " + alR.get(i));
    						alNew.add(alR.get(i));
    					}
    				}
    			}
    			break;
    		}
    		case 'B': {
    			// Die gemeinsame Schnittmenge aller Elemente beider AL werden ermittelt. Es wird also eine Gesamtmenge beider AL übergeben
    			HashSet<String> hashSet = new HashSet<String>();
    			hashSet.addAll(alR);
    			hashSet.addAll(alL);
    			alR.clear();
    			alL.clear();
    			alNew.addAll(hashSet);
    			Collections.sort(alNew);
    			break;
    		}
    		default: {
    			throw new Exception("[alVergleich]: Kein gültiger Parameter für diese Funktion! Gültig sind 'L','R','B' !");
    		}
    		} // Ende switch
    		return alNew;
    	}
  6. Hm. Du bist noch ein Programmier-Neuling, oder?

    Du brauchst bei Switch-Statements keine geschweiften Klammern.
    Und alNew ist eine Objektvariable? Ich rate dir dazu lieber eine neue ArrayList anzulegen anstatt eine Objektvariable dafür zu verwenden. Denn dann musst du diese Objektvariable jedes mal leeren, bevor du die Funktion aufrufst.

    Ist der size()-check wirklich notwendig?


    Ich hatte einfach mal Lust das ganze in Clojure nachzuprogrammieren. Kannst du dir ja mal anschauen, falls es dich interessiert:
    (import '(java.util ArrayList))
    
    (def alEins (ArrayList. ["Eins" "Zwei" "Drei"]))
    (def alZwei (ArrayList. ["Eins" "Drei" "Vier"]))
    
    (defn enthalten-check [selector]
     (fn [referenz testset]
      (selector #(.contains referenz %) testset)))
    
    (def auch-in (enthalten-check filter))
    (def fehlt-in (enthalten-check remove))
    
    (defn schnittmenge [a b]
     (auch-in a (auch-in b a)))
    
    (auch-in alEins alZwei); gibt "Eins" "Drei" zurück
    (fehlt-in alEins alZwei); gibt "Vier" zurück
    (schnittmenge alEins alZwei); gibt "Eins" "Drei" zurück
    (schnittmenge alZwei alEins); gibt auch "Eins" "Drei" zurück, da symmetrisch


    Beitrag zuletzt geändert: 11.3.2012 16:16:50 von bladehunter
  7. Autor dieses Themas

    n******k

    Danke für die Info!

    Du brauchst bei Switch-Statements keine geschweiften Klammern.

    Stimmt, können wegbleiben! ;-)

    Und alNew ist eine Objektvariable? Ich rate dir dazu lieber eine neue ArrayList anzulegen

    Habe ich auch so gemacht, ist im Coding leider nicht mit drin!
    private ArrayList<String> alNew = new ArrayList<String>(); // Rückgabeliste

    Gruß
    Frank :-)

    Beitrag zuletzt geändert: 11.3.2012 17:40:03 von nas-back
  8. nas-back schrieb:
    Und alNew ist eine Objektvariable? Ich rate dir dazu lieber eine neue ArrayList anzulegen

    Habe ich auch so gemacht, ist im Coding leider nicht mit drin!
    private ArrayList<String> alNew = new ArrayList<String>(); // Rückgabeliste


    So meine ich das nicht. Ich würde das (konzeptionell) eher so lösen:
    public static ArrayList<String> meineFunktion(
      ArrayList<String> a,
      ArrayList<String> b ) {
    
      ArrayList<String> ergebnis = new ArrayList<String>();
      //.... Code mit ergebnis.add()
      return ergebnis
    }

    So dass die Variable ergebnis nicht zu einem bestimmten Objekt gehört, sondern eine lokale Variable in der Methode meineFunktion ist, die dann am Ende zurückgegeben wird.

    Beitrag zuletzt geändert: 11.3.2012 18:03:46 von bladehunter
  9. Autor dieses Themas

    n******k

    Okay, hast ja recht, stimme dir voll zu.... wie gesagt, das Coding ist mal eben schnell als erster Ansatz zusammengeknüppelt (und funzt sogar wie ich es mir gedacht hatte) ;-p
    Danke für deine Rückmeldungen. :-)
  10. In diesm Zusammenhang ist auch öfters mal die recht unbekannte Methode Collection.retainAll(...) von nutzen.
    http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html#retainAll%28java.util.Collection%29
    - - - update: nun ausführlicher ... - - -
    set1 = new HashSet( listA );
    set1.retainAll( listB );
    set2 = new HashSet( listB );
    set2.retainAll( listA );
    ergebins = new HashSet( set1 );
    ergebnis.addAll( set2 );
    // ergebnis-Ausgabe
    Kommt das hin?


    Beitrag zuletzt geändert: 13.3.2012 22:06:52 von c3oe
  11. Moin,

    c3oe schrieb:
    In diesm Zusammenhang ist auch öfters mal die recht unbekannte Methode Collection.retainAll(...) von nutzen.
    http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html#retainAll%28java.util.Collection%29

    Dann erkläre doch mal bitte, in wiefern diese Methode eine Hilfe für die Problemlösung darstellt? Schließlich entfernt diese Methode alle Elemente die nicht in beiden Collections enthalten sind.

    Aber vielleicht hast Du einen anderen Lösungsansatz?

    Gruß,
    Pawnee
  12. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html#removeAll(java.util.Collection)

    schau dir lieber mal diese Methode an.

    Removes all this collection's elements that are also contained in the specified collection (optional operation). After this call returns, this collection will contain no elements in common with the specified collection.


    Generell kann ich nur sagen: Immer erst mal schaun ob das problem schonmal von jmd. gelöst wurde bevor man selbst versucht es zu lösen.
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!