Java Prüfen ob String in ArrayList enthalten ist

vogti

Cadet 2nd Year
Registriert
Feb. 2008
Beiträge
23
Hallo,

ich habe 2 Arraylisten. spalteA und spalteB. Ich möchte jetzt alle Strings aus spalteA darauf testen, ob sie auch in spalteB enthalten sind. Wenn nicht, so soll dieser String ausgegeben werden.

Code:
	public void findeSingle(){

		for (String s:spalteA){
			for (String t:spalteB){
				if(s.contains(t)==false){
					einzelneWerte.add(s);
				}
				else {
					break;
				}
			}
		}
	}

Sowohl spalteA als auch spalteB werden auf jedenfall richtig befüllt und einzelneWerte werden richtig ausgegeben, so dass der Fehler auf jeden Fall in der findeSingle() ist. Woran liegts? Habe ich einen Denkfehler?


Viele Grüße,
Christoph

Edit:
Eventuell wäre der Fehler der ausgegeben wird auch ganz interessant:
Code:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2760)
	at java.util.Arrays.copyOf(Arrays.java:2734)
	at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
	at java.util.ArrayList.add(ArrayList.java:351)
	at vogti.GetDuplicate.findeSingle(GetDuplicate.java:93)
	at vogti.Start.main(Start.java:12)
 
Öhm wie groß sind deine Listen? Anscheinend hast du da den Speicher von Java ziemlich vollgepackt ;)

Die Stelle, an der der Fehler im Code ist siehst du ja auch in der Exception:
vogti.GetDuplicate.findeSingle(GetDuplicate.java:93)
 
Wie viel Elemente sinden denn in spalteA und B? Sieht aus als ob das weit ueber eine Million sind, sonst wuerde wohl kaum ein Memory Error kommen.
 
Nochmal zusammengefasst: Du hast zwei Listen mit Strings und willst alle die Strings heraussuchen, die in Spalte A vorkommen, in Spalte B aber nicht.

Das hat aber mit dem, was der Code macht, recht wenig zu tun.

1. Mit s.contains(t) vergleicht du nicht die beiden Strings s und t, sondern überprüfst, ob t in s vorkommt. (das wäre z.B. bei t = "rot" und s = "Brot" der Fall)

2. s wird jedes Mal hinzugefügt, wenn ein nicht passendes t überprüft wird.

3. Selbst wenn ein passendes t existiert, wird s vorher mitunter schon oft hinzugefügt sein.

(4. Es ist nicht nötig, einen Wahrheitswert auf Gleichheit mit false zu prüfen. Einfach mit ! verneinen.)
 
spalteA sind 7942 und spalteB 7941 Elemente. Dachte nicht, dass das zu viel ist? Hatte eine ähnliche Funktion die eben alle doppelten Werte ausgeben soll - das hat funktioniert - mit ähnlich vielen Elementen:

Code:
public void vergleicheDaten(){
		
		for(String s:spalteA){
			for(String t:spalteB){
				if(s.equals(t)){
					doppelteWerte.add(s);
				}
				
			}
			
			
		}

		
	}
 
deepfritz schrieb:
Nochmal zusammengefasst: Du hast zwei Listen mit Strings und willst alle die Strings heraussuchen, die in Spalte A vorkommen, in Spalte B aber nicht.

Das hat aber mit dem, was der Code macht, recht wenig zu tun.

1. Mit s.contains(t) vergleicht du nicht die beiden Strings s und t, sondern überprüfst, ob t in s vorkommt. (das wäre z.B. bei t = "rot" und s = "Brot" der Fall)

2. s wird jedes Mal hinzugefügt, wenn ein nicht passendes t überprüft wird.

3. Selbst wenn ein passendes t existiert, wird s vorher mitunter schon oft hinzugefügt sein.

(4. Es ist nicht nötig, einen Wahrheitswert auf Gleichheit mit false zu prüfen. Einfach mit ! verneinen.)

Ja, richtig zusammengefasst,

zu 1. das wusste ich nicht, ich dachte, dass Contains die kompletten Strings vergleicht. Wie stellt man das sonst an, wenn nciht mit Contains?
 
In deiner anderen Methode hast du doch schon korrekt s.equals(t) verwendet. Ein Blick in die API hilft hier weiter.

(Bei Strings wird sogar meistens s == t funktionieren, sollte man aber nicht unbedingt machen.)


Wesentlich ist aber das Problem, welches durch 2 und 3 verursacht wird.
 
quick and dirty:

Code:
for (String s:spalteA){
  boolean found_string = false;
			
  for (String t:spalteB)
    if(t.contains(s)){
      found_string = true;
      break;
    }
	
  if (!found_string)
    if (!einzelneWerte.contains(s))
      einzelneWerte.add(s);
}
 
Strings vergleicht man mit compareTo ;) equals ist nicht ganz so vorbildlich.

Was du auf jedenfall mal probieren kannst:
Schätze mal ab, wieviele Werte am Ende in die Liste kommen (also einzelneWerte) und initialisier die mal mit einer passenden Größe.
 
Stimmt, compareTo(). Mein Fehler.


Da fällt mir ein: Kann es sein, dass du das contains der ArrayList mit dem contains von String durcheinander gebracht hast? Sieht für mich jedenfalls fast danach aus...
 
wenn du es ganz richtig haben willst, lade alle wörter der spalteA in eine hashmapA, genauso alle wörter der spalteB in die hashmapB. danach lass eine forschleife drauf, die dir aus der hashmapA duplikate aus B entfernt.
 
Oder bau einfach ein Set in das du das ganze einfügst, wiel da können keine duplikate drin sein ;)
 
Wenn du wissen willst ob alle Werte aus SpalteA auch in SpalteB sind dann:

Code:
for(String str : spalteA){
    if(!spalteB.contains(str))
        System.out.println(str);
}
 
Zurück
Oben