# Eine ArrayList auf gleiche Inhalte prüfen



## Lim (21. Aug 2012)

Hallo zusammen, ich bin recht neu in der Welt des Programmierens und komme gerade einfach nicht weiter. 

Die Aufgabe lautet: 
Eine Textdatei soll in eine Liste Wort für Wort eingelesen werden und in anschleissend soll in der Client Classe (main) in dieser Liste überprüft werden, ob sie mehrfach das selbe Wort(String) enthällt wenn ja zählen wie oft es vorkommt.


Das ist momentan meine Listenklasse, welche mir die einzelnen Worte der Text datei in eine Liste speichern soll, aber irgendwie scheint ich da noch etwas nicht richtig zu machen. Des weiteren habe ich keinen schimmer wie ich eine Liste mit sich selbst vergleichen soll... bis jetzt kann ich nur 2 listen miteinander Vergleichen und das soll es ja nicht sein. köntnet ihr mir mit einem Denkanstoß helfen? 


```
public class Wortliste {

	private String filename = null;;
	
	public Wortliste(String filename){
		this.filename=filename;
	}
	
	public void leseText() throws FileNotFoundException {
		FileReader fr = new FileReader(filename);
		BufferedReader br = new BufferedReader(fr);
		
		String[] stringarray = null;
		List<String> meineListe = Arrays.asList(stringarray);
		try {
			stringarray = br.readLine().split(" ");
			for(String element : meineListe) {
				System.out.println("element: " + element);
				meineListe.add(element);
			}//try
		} catch (IOException e) {
			e.printStackTrace();
		}//catch
	}//leseText
	
}//Class
```


----------



## Michael... (21. Aug 2012)

Der Code ist etwas "komisch" und wirft am Dateiende eine NullpointerException

Zunächstmal Liste anlegen:

```
List<String> meineListe = new ArrayList<String>();
```
Dann mittels BufferedReader in einer Schleife die Datei zeilenweise einlesen

```
String line;
while((line=br.readLine())!=null) {
```
Dann die Zeile splitten und die erhaltenden Wörter in die Liste einfügen.

Ob man eine Liste mit sich selbst oder einer anderen Liste vergleicht ist egal - funktioniert beides genau gleich.
Hilfreich wäre es die Liste vorher zu sortieren (Collections.sort(....)) so stehen gleiche Wörter hintereinander. Hilfreich wäre auch eine Liste oder eine Map in der die Worte nur einmal vorkommen, irgendwo muss ja auch die Anzahl gespeichert werden.


----------



## jgh (21. Aug 2012)

hier zumindest mal dein Code, der dann auch das macht, was du eigentlich wolltest:
wie oft nun jedes Wort vorkommt, hat Michael dir ja schonmal ein paar Tipps gegeben...


```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Wortliste {

	private String filename = null;;

	public Wortliste(String filename) {
		this.filename = filename;
	}

	public void leseText() throws IOException {
		FileReader fr = new FileReader(filename);
		BufferedReader br = new BufferedReader(fr);

		List<String> meineListe = new ArrayList<String>();
		String s = null;
		while ((s = br.readLine()) != null) {
			String[] line = s.split(" ");
			for (String element : line) {
				System.out.println("element: " + element);
				meineListe.add(element);
			}

		}// leseText

	}
}

class Client {
	public static void main(String[] args) {
		try {
			new Wortliste("filetest.txt").leseText();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
```


----------



## Spacerat (21. Aug 2012)

Wörter einer Textdatei zählen gab es schon. Evtl. hilft dir das ja weiter.
http://www.java-forum.org/java-basics-anfaenger-themen/124761-textdatei-einlesen.html#post808738


----------



## Lim (21. Aug 2012)

Vielen Dank für die Antworten. Das hilft mir alles sehr viel weiter *brett vom Kopf wegnehm*


----------



## Lim (22. Aug 2012)

so... ich nochmal, ich habe das nun auf anweisung meines Teamchefs alles 3 mal wieder über den haufen geshcmissen und nun ist es theoretishc so wie er es haben möchte, aber irgendwo habe ich wohl dennoch einen Fehler, den meine for-schleife schleift nur ein einziges mal. oder zumindest ist es in der Ausgabe am ende dann so... 

hier mein erweiterter Code (zu dem umgestellten siehe oben): 


```
import java.util.Collections;
import java.util.List;

public class Sortieren {
	
	private List<String> meineWortliste = null;
	
	public Sortieren(List<String> meineWorteliste) {
		this.meineWortliste = meineWorteliste;
	}
	public void sortiertwerden() {
		
		Collections.sort(meineWortliste,String.CASE_INSENSITIVE_ORDER);		
		for(String wort : meineWortliste){
			System.out.println("Wort:" + wort);
		}
	}
	  
}
```


```
import java.util.ArrayList;
import java.util.List;

public class Zaehlen {
	
	private List<String> sortedList = null;
	private List<Wortanzahl> meineWorte = null;
	
	public Zaehlen(List<String> sortedList) {
		this.sortedList = sortedList;
		this.meineWorte = new ArrayList<Wortanzahl>();
	}
		
	public void zaehler() {

		for(String einWort : sortedList){
			if(this.meineWorte.isEmpty()) {
				Wortanzahl wortAnzahl = new Wortanzahl(einWort, 1);
				this.meineWorte.add(wortAnzahl);
			}else{
			for (Wortanzahl element: meineWorte) {
				if(element.getWort().equals(einWort)){
					element.getAnzahl();
					element.setAnzahl(+1);
				}//if
			    }//for
                                   }//else
		}//for
		for(Wortanzahl index : meineWorte){
			System.out.println(index.getAnzahl() + "," + index.getWort());
		}		
	}//zaehler
	
	public class Wortanzahl{
		private String wort = null;
		private int anzahl = 0;
				
		public Wortanzahl(String wort, int anzahl) {
			this.wort = wort;
			this.anzahl = anzahl;
		}
		/**
		 * @return the wort
		 */
		public String getWort() {
			return wort;
		}
		/**
		 * @param wort the wort to set
		 */
		public void setWort(String wort) {
			this.wort = wort;
		}
		/**
		 * @return the anzahl
		 */
		public int getAnzahl() {
			return anzahl;
		}
		/**
		 * @param anzahl the anzahl to set
		 */
		public void setAnzahl(int anzahl) {
			this.anzahl = anzahl;
		}
	}
}
```

könnte mir jemand auf die Sprünge helfen wo ich da grade gedanklich mich verschleift habe?


----------



## jgh (22. Aug 2012)

also nur schnell mal überflogen:

[JAVA=14]    
    public void zaehler() {

        for(String einWort : sortedList){
            if(this.meineWorte.isEmpty()) {
                Wortanzahl wortAnzahl = new Wortanzahl(einWort, 1);
                this.meineWorte.add(wortAnzahl);
            }
            for (Wortanzahl element: meineWorte) {
                if(element.getWort().equals(einWort)){
                    element.getAnzahl();
                    element.setAnzahl(+1);
                }//if
            }//for

        }//for[/code]

wenn deine Liste [c]meineWorte[/c] leer ist, addest du ein Wort...und wenn sie nicht leer ist, ja dann machst du irgendwie nichts...kann das atm allerdings nicht ausprobieren, aber ich tippe mal da liegt der Hase im Pfeffer


----------



## Lim (22. Aug 2012)

*Kopf Tisch*
Danke, ich ahb das mal geändert, nun solte er was tun, aber er macht so immer noch nicht das richtige... 


```
public void zaehler() {

		for(String einWort : sortedList){
			if(this.meineWorte.isEmpty()) {
				Wortanzahl wortAnzahl = new Wortanzahl(einWort, 1);
				this.meineWorte.add(wortAnzahl);
			}
			for (Wortanzahl element: meineWorte) {
				if(element.getWort().equals(einWort)){	
					int zahl = element.getAnzahl();
					zahl = zahl++;
					element.setAnzahl(zahl);
				}//if
			}//for
			
		}//for
		for(Wortanzahl index : meineWorte){
			System.out.println(index.getAnzahl() + "," + index.getWort());

		}		
	}//zaehler
```


----------



## jgh (22. Aug 2012)

es bleibt immer noch das gleiche Problem...du addest deiner Liste 
	
	
	
	





```
meineWorte
```
 nur dann ein Wort, wenn diese leer ist, also genau 1x !!!!
 und da in der Liste 
	
	
	
	





```
meineWorte
```
  nur ein einziges Wort vorhanden ist, kannst du vergleichen wie du willst...das einzige was geht, ist die Anzahl zu erhöhen...

ich habe diese Aufgabe gelöst, aber die Lösung einfach zu posten wäre zu billig...sollst ja auch was davon haben.
Als Tipp: lass diese 
	
	
	
	





```
isEmpty()
```
 if-Abfrage erstmal weg und schau dann mal weiter...


----------



## jgh (22. Aug 2012)

Das war mein erster Anwortsentwurf...bevor er ganz umsonst war^^
Einige Fehler hast du ja schon ausgebessert.

[ot]also...dein Fehler liegt in der 
	
	
	
	





```
zaehler()
```
-Methode, nach etwas längerem Basteln habe ich auch eine Lösung, aber die einfach so zu posten, mmmh ne sollst lieber selber drauf kommen.

Du hast ja 2 Listen, eine 
	
	
	
	





```
sortedList
```
und eine 
	
	
	
	





```
meineWorte
```
, die eine ist sortiert und die andere noch leer.


```
for (String einWort : sortedList) {
			//du iterierst über deine sortiere Liste, soweit ok...
			if (this.meineWorte.isEmpty()) {
				//du fragst bei jedem Wort nach, ob diese Liste leer ist...
				//wenn diese Liste leer ist, addest du der Liste den Datentyp Wortanzahl mit 1 und dem Wort aus der sortierten Liste, bei dem du dich befindest
				Wortanzahl wortAnzahl = new Wortanzahl(einWort, 1);
				this.meineWorte.add(wortAnzahl);
			} else {//wenn diese Liste aber nicht mehr leer ist...also nach dem 1. Durchgang, 
				//läufst du über deine Liste meineWorte und vergleichst das aktuelle Wort mit deiner Liste, wenn du es findest...machst du komische Sachen, wenn nicht machst du garnichts
				
				for (Wortanzahl element : meineWorte) {
					if (element.getWort().equals(einWort)) {
						 element.getAnzahl();//mit diesem Wert machst du nichts
                    element.setAnzahl(+1);//mit dieser Zeile setzt du die Anzahl immer auf 1
//element.setAnzahl(element.getAnzahl()+1); dieses Codefragment erhöht die Anzahl um 1
					}// if
				}// for
			}// else
		}// for
```
[/ot]


----------



## Michael... (22. Aug 2012)

Zum einen ist die if isEmpty Abfrage überflüssig/falsch zum anderen musst Du nicht bei jedem Wort durch die gesamte Liste "meineWorte" iterieren. Da der Input ja eine sortierte Liste ist musst Du ja nur prüfen ob das "neue" Wort mit dem zuvor gelesenen Wort übereinstimmt. Es Reicht also eine if-Abfrage.


```
if aktuelles Wort == Vorgänger 
    increase wortzahl 
else
    new wortzahl
    meineWorte.add wortzahl
```


----------

