Listenbearbeitung

Löwenherz

Mitglied
Hallo liebe Forum-Mitglieder,

ich arbeite seit einigen Tagen an einem Javaprojekt und bin auf folgendes Problem gestoßen:

Ich möchte in einer Methode eine Liste von Files nach bestimmtem Inhalt durchsuchen (und zwar element für element) und wenn dieser Inhalt in einem dieser Einträge gefunden wird, dann möchte ich diesen in einer anderen Liste adden. Am Ende soll meine Methode diese neue Liste zurückgeben.
Ich habe es wie folgt probiert:

Java:
public List<File> getSomething (String suchString) {
  DingensListe  liste = new DingensListe();                   // die zu durchsuchende Liste
  for(File file : liste){
    BufferedReader in = new BufferedReader(new FileReader(file));
    String zeile = null;
    while((zeile=in.readline())!=null){
      if (zeile.contains(gesuchtes))  {
        List neueListe = new LinkedList();
        neueListe.add(file);
      }
    }
  }

Leider wenn ich den Inhalt dieser Liste abfrage (mit system.out z.B. bekomme ich kein Ergebnis!)

Wäre euch dankbar für eure Hilfe.
 
Zuletzt bearbeitet von einem Moderator:

ARadauer

Top Contributor
jedesmal wenn du was findest erzeugst du eine neue liste, du darfst di liste nur einmal erzeugen und musst in die bestehende einfügen...


Java:
public List<File> getSomething(String suchString) {
         DingensListe liste = new DingensListe(); // die zu durchsuchende Liste
         List neueListe = new LinkedList();
        for (File file : liste) {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String zeile = null;
            while ((zeile = in.readLine()) != null) {
                if (zeile.contains(suchString)) {
                    
                    neueListe.add(file);
                }
            }
        }
        return neueListe;
    }

btw: ich hab meine 6K ganz übersehen ;(
 

Landei

Top Contributor
Bitte generisch: [c]List<File> neueListe = new LinkedList<File>();[/c].

Und Simba: Bitte [java]-Tags verwenden...
 
N

nillehammer

Gast
Und irgendwie macht es auch keinen Sinn, die zu durchsuchende Liste erst in der Methode zu erzeugen:
Java:
DingensListe liste = new DingensListe(); // die zu durchsuchende Liste
Was immer DingensListe ist, es ist glaube ich schlauer, diese als Parameter an die Suchmethode zu übergeben:
Java:
/**
   *  Searches for a String in a given Collection of Files and returns a List of Files
   *  containing the String.
   *  @param files the Collection of Files to search for a given String, must not be null
   *  @param suchString the String to search for
   *  @return the List of Files containing suchStr, is never null, but may be empty
   */
public List<File> getSomething(final Collection<File> files,String suchString) {
        
        List<File> neueListe = new LinkedList();
        
        for (File file : files) {
            BufferedReader in = new BufferedReader(new FileReader(file));
            String zeile = null;
            while ((zeile = in.readLine()) != null) {
                if (zeile.contains(suchString)) {
                    
                    neueListe.add(file);
                }
            }
            // Closen nicht vergessen, sonst hast Du ganz viele offene FileHandles
            // und kein anderer kann in die Files schreiben.
            in.close();
        }
        return neueListe;
    }
Exception Handling hab ich der Einfachheit weggelassen...
 

Löwenherz

Mitglied
Danke erstmals für eure Vorschläge:)
Und wie kann ich nachher die Elemente der neuen Liste abragen (ich meine natürlich außerhalb dieser Methode) ?
 
N

nillehammer

Gast
Und wie kann ich nachher die Elemente der neuen Liste abragen (ich meine natürlich außerhalb dieser Methode) ?
Methode aufrufen und return-Wert entweder direkt benutzen oder in einer Variablen zwischenspeichern. Z.B. so:
Java:
final Collection<File> searchCollection = ... code, der die Collection (bspw. List, Set o.ä.) erzeugt...;
final List<File> foundList = getSomething(searchCollection, "suchText");
.. Code, dermit der foundList was macht ...
 

Löwenherz

Mitglied
Hallo,

ich habe meine Methode so gestaltet:

Java:
public List<File> getNachfolger(List<File> Requirements,String suchString) throws IOException{
		List<File> NachfolgerListe= new LinkedList<File>();
		for (File file:Requirements){
			BufferedReader in = new BufferedReader(new FileReader(file));
			String zeile=null;
			while((zeile=in.readLine())!=null){
				if((zeile.startsWith("!!Source:"))&&(zeile.contains(suchString))){

             NachfolgerListe.add(file);
             
            
				}			
			}
			in.close();
		
		 }
		
		 
		
		return NachfolgerListe;	
		
	}

aber wenn ich das return-Ergebnis abfrage (mit Iterator oder ähnliches) dann kriege ich keine Einträge!
Könnt ihr weiterhelfen?

[EDIT]Code ist bitte innerhalb von
Java:
-Tags zu posten!
Im Beitragseditor kann man dazu das Symbol [IMG]http://www.java-forum.org/images/editor/java.png[/IMG] klicken, dann werden die Tags erzeugt.
L-ectron-X[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Löwenherz hat gesagt.:
aber wenn ich das return-Ergebnis abfrage (mit Iterator oder ähnliches) dann kriege ich keine Einträge!
Könnt ihr weiterhelfen?
Da der Code jetzt gut aussieht (abgesehen von den groß geschriebenen Variablennamen), würde ich annehmen, dass Deine Files den Suchstring schlicht nicht enthalten oder ihn zwar enthalten aber die entspr. Zeile nicht mit "!!Source:" anfängt. Mach die Positivprobe, indem Du folgende Schritte ausführst.
- Generiere Dir mit einem Texteditor ein File, das folgende Zeile enthält: "!!Source: meinSuchString"
- Speichere dieses ab
- Rufe Deine Suchmethode mit diesem File und dem suchString "meinSuchString" auf. In der Ergebnisliste müsste es auftauchen, bin mir ziemlich sicher.
 

Oben