Erste Schritte Suche nach Zeichenkette

GGK_01

Bekanntes Mitglied
Hallo,

Status:
Ich habe eine Lise von 0-n Elementen. (1.3.5.45.342.77854.0.1.1.443.5, 1.23.22343.522,44232.2342...) bei denen ich wissen will, ob und wie oft diese in einem Textfile in Kombination mit dem String "Namen" vorkommen.


Problem:
die zweite Suche mit dem line.contains greift mir leider nicht bzw. kann es auch sein, dass wenn die Suche nach dem ersten Listenelement fertig ist, die Iteration auf das zweite Element gar nicht mehr durchgeführt wird.

Anbei der Code:
Java:
FileReader freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);
int counter = 0;
		
		for (int i = 0; i < list.size(); i++) {
			while (reader.readLine() != null) {
				line = reader.readLine();
				if (line.contains("Name")) {
					System.out.println("Listenelement: "+list.get(i));
					if (line.contains(list.get(i))) {
						counter++;
						System.out.println(counter +list.get(i) +" found");
						
					}
					
				}
				
			}
			
		}
		freader.close();

geworfen wird eine NullPointerException.

Ich wäre euch sehr dankbar.

LG, GGK
 

AquaBall

Top Contributor
Java:
 while (reader.readLine() != null) {
     line = reader.readLine();

Du liest 2 x Daten.
Da überspringst du jede 2. Zeile,
und landest bei ungerader Anzahl auf Null.

Java:
 while ((line = reader.readLine()) != null)
sollte es beheben.
 
G

Gonzo17

Gast
Wo genau tritt die NPE denn auf? Kann da jetzt nur spekulieren, aber tendenziell würde ich mal sagen, dass entweder
Code:
list
nicht initialisiert wurde (das wäre also Zeile 9) oder in deinem File nichts drin ist oder du beim Datei-Ende bist und deshalb
Code:
line
null ist.

Edit:
Code:
line
kann ja deshalb null sein, weil du zwei Überprüfungen machst, so wie AquaBall schon sagte.
 

AquaBall

Top Contributor
PS: Ich würde auch nicht 3 x
Code:
+list.get(i)
benutzen.
Schreib lieber 1x
Code:
String myText=list.get(i);
, und verwende das dann. Ist leichter lesbar und erzeugt 1/3 des Garbage-Traffics.
 

Fant

Bekanntes Mitglied
Du rufst in jedem Schleifendurchlauf einmal zu oft readLine() auf. Du könntest es zB so machen:

Java:
(...)
for (int i = 0; i < list.size(); i++) {
            while ( (line=reader.readLine()) != null) {
                if (line.contains("Name")) {
(...)
 

GGK_01

Bekanntes Mitglied
Java:
 while (reader.readLine() != null) {
     line = reader.readLine();

Du liest 2 x Daten.
Da überspringst du jede 2. Zeile,
und landest bei ungerader Anzahl auf Null.

Java:
 while ((line = reader.readLine()) != null)
sollte es beheben.

Danke...das wars!!

LG, GGK
 

GGK_01

Bekanntes Mitglied
jetzt hat sich noch ein Problem eingeschlichen.

Ich möchte letzten Durchlauf bei dem die Variable counter den maximalen Wert erreicht mit unten genannter Zeile ausgeben.

Wie geh ich denn das an?
Java:
System.out.println(counter +list.get(i) +" found");

Danke GGK
 

Fant

Bekanntes Mitglied
Nicht sehr schön, aber klappt:

Java:
System.out.println(""+counter +list.get(i) +" found");

Gruß Fant
 

GGK_01

Bekanntes Mitglied
Ich hab mich vielleicht unklar ausgedrückt. Im folgenden Code...
Java:
FileReader freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);
int counter = 0;
        
        for (int i = 0; i < list.size(); i++) {
            while (line = reader.readLine() != null) {
                if (line.contains("Name")) {
                    //*System.out.println("Listenelement: "+list.get(i));
                    if (line.contains(list.get(i))) {
                        counter++;
                        System.out.println(counter +list.get(i) +" found");
                        
                    }
                    
                }
                
            }
            
        }
        freader.close();

bringt bei jedem Fund die Zeile
Code:
System.out.println(counter +list.get(i) +" found");
Ich möchte aber nicht, dass bei jedem Fund angezeigt wird, dass ein Listenelement gefunden wurde, sondern nur den maximalen Wert.

Bsp: 6. 12323.3422.1234234.52425.2 found

Danke GGK
 

AquaBall

Top Contributor
Java:
FileReader freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);
int counter = 0;
        
        for (int i = 0; i < list.size(); i++) {
            while (line = reader.readLine() != null) {
                if (line.contains("Name")) {
                    //*System.out.println("Listenelement: "+list.get(i));
                    if (line.contains(list.get(i)))  counter++;
                }
            }
        }
        System.out.println(counter +" Elemente geunden.");
        freader.close();

Wenn du irgendwas mit "max" haben willt, dann musst du erstmal definieren, was für dich "größer" bedeutet. Wer größer als was? Wie vergleichst du? ...
Davon ist im Programm nichts zu erkennen.
Bisher zählst du nur!
 
Zuletzt bearbeitet:

GGK_01

Bekanntes Mitglied
ich möchte wissen, wie oft ein Listenelement in der Datei vorkommt...
also:
Code:
6. 23423.342..324.134 mal gefunden
3. 1.3.2343.23445.3 mal gefunden


ich möchte nicht wissen:
Code:
1. 23423.342..324.134 gefunden
2. 23423.342..324.134 gefunden
3. 23423.342..324.134 gefunden
4. 23423.342..324.134 gefunden
5. 23423.342..324.134 gefunden
6. 23423.342..324.134 gefunden

1. 1.3.2343.23445.3 gefunden
2. 1.3.2343.23445.3 gefunden
3. 1.3.2343.23445.3 gefunden
 
Zuletzt bearbeitet:

Fant

Bekanntes Mitglied
Java:
FileReader freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);
int counter = 0;
        
        for (int i = 0; i < list.size(); i++) {
            while (line = reader.readLine() != null) {
                if (line.contains("Name")) {
                    if (line.contains(list.get(i))) {
                        counter++;                                         
                    }                    
                }                
            }
            System.out.println(counter +list.get(i) +" found");
            counter = 0;
        }
        freader.close();

So?
 

Landei

Top Contributor
Etwas OT, aber ich finde diese [c]while (line = reader.readLine() != null)[/c]-Idiom einfach grauenhaft. Warum nicht [c]for(String line= reader.readLine(); line != null; line = reader.readLine())[/c]?
 

AquaBall

Top Contributor
Päng!

Damit der Reader neu starten kann:
Java:
        for (String element : list) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            int counter = 0;
            while ( (line = reader.readLine()) != null) {
                if (line.contains("Name")) {
                    if (line.contains(element)) {
                        counter++;                                         
                    }                    
                }                
            }
            System.out.println("'" + element +"' found "+counter +" times.");
        }

(Und etwas verkürzt in div. Schreibweisen.)
 
Zuletzt bearbeitet:

AquaBall

Top Contributor
Etwas OT, aber ich finde diese [c]while (line = reader.readLine() != null)[/c]-Idiom einfach grauenhaft. Warum nicht [c]for(String line= reader.readLine(); line != null; line = reader.readLine())[/c]?

Findest du das eleganter??

Sieht meiner Mainung nach viel schrecklicher aus, und beinhaltet den eigentlichen readLine-Vorgang wieder 2 x, was wesentlich schlechter zu lesen und schlechter zu warten ist.

(Kürzer ist es auch nicht. Schneller soundso nicht.)
 

Landei

Top Contributor
Zum einen finde ich die klare "Aufgabenteilung" besser (Initialisierung, Schleifen-Test, Schleifen-Schritt), zum anderen wird der Scope von line auf die Schleife beschränkt (es kann also niemand hinter der Schleife auf die Idee kommen, mit line - das ja nun null ist - irgendetwas dummes zu machen).

Dass das so "lang" ist, liegt auch an der verkrüppelten API. Warum nicht [c]BufferedReader implements Iterable<String>[/c]? Dann könnte man [c]for(String line : reader)[/c] schreiben.
 

AquaBall

Top Contributor
Stimmt! Gute Idee!
(Hab ich auch wieder was dazugelernt)

Langsam wird's richtig elegant:
Java:
for (String element : list) {
   BufferedReader reader = new BufferedReader implements Iterable<String>(new FileReader(file));
   int counter = 0;
   for (String line : reader) 
       if (line.contains("Name") && line.contains(element)) 
           counter++;                                         
   System.out.println("'" + element +"' found "+counter +" times.");
}

Wobei
Code:
BufferedReader reader = new BufferedReader implements Iterable<String>(new FileReader(file));
ungeprüft ist (damit arbeite ich nie), vielleicht gehts noch besser.
 

Landei

Top Contributor
Das ist nicht "ungeprüft", das ist einfach keine gültige Syntax.

Entweder Oracle ändert BufferedReader irgendwann mal entrsprechend, oder man schreibt sich einen Wrapper (ungetestet):

Java:
import java.io.BufferedReader;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class BRIterable implements Iterable<String> {

    private final BufferedReader reader;

    public BRIterable(BufferedReader reader) {
        this.reader = reader;
    }

    @Override
    public Iterator<String> iterator() {
        return new Iterator<String>() {
            
            private String line;  { read(); }
            
            private void read(){
               try {
                 line = reader.readLine();
               } catch (Exception ex) {
                   throw new RuntimeException(ex);
               }
            }
            
            @Override
            public boolean hasNext() {
                return line != null;
            }

            @Override
            public String next() {
                if(! hasNext()) {
                    throw new NoSuchElementException();
                }
                String result = line;
                read();
                return result;
            }

            @Override
            public void remove() {
               throw new UnsupportedOperationException();
            }
        };
    }
}

Damit kann man jetzt schreiben
Java:
for(String line : new BRIterable(reader)) {
   ...
}
 

GGK_01

Bekanntes Mitglied
Päng!

Damit der Reader neu starten kann:
Java:
        for (String element : list) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            int counter = 0;
            while ( (line = reader.readLine()) != null) {
                if (line.contains("Name")) {
                    if (line.contains(element)) {
                        counter++;                                         
                    }                    
                }                
            }
            System.out.println("'" + element +"' found "+counter +" times.");
        }

(Und etwas verkürzt in div. Schreibweisen.)


Danke..ich hab mich für deine Variante entschieden...ist einfach im Code...und funktioniert perfekt!

GGK
 

Crian

Top Contributor
[TIPP]Eine generelle Anmerkung: Ist es wirklich schlau, die Datei n-Mal zu lesen? Wäre es nicht sinniger, die Schleife über die Liste nach innen zu packen?[/TIPP]
 

Crian

Top Contributor
Das hängt davon ab. IO-Methoden sind in der Regel teuer.

Bei 10.000 Zeilen und 4 Einträgen in der Liste wäre es zum Beispiel sehr viel geschickter, die Datei nur einmal zu lesen.
 

GGK_01

Bekanntes Mitglied
Ist sicher eine Überlegung wert...jedoch hab ich das Programm gerade released...ich plane diese Änderung ein...

Danke für den Hinweis

GGK
 

AquaBall

Top Contributor
1) Bei 10.000 Zeilen wirst du bald mal an die Speichergrenze kommen. (Je nach Laufumgebung.)
Für diesen Zweck sind externe Speicher erfunden worden. :oops:

2) Beim Umpacken der Schleifen wirst du dein blaues Wunder mit Counter erleben!
Weil dann nicht mehr rauskommt, wieviele Zeilen den aktuellen Suchstring enthalten,
sondern wieviele Suchstrings in der aktuellen Zeile vorkommen!

Die Moral von der Geschicht':
Schleifen tauschen tut man nicht!
 
Zuletzt bearbeitet:

AquaBall

Top Contributor
Das tust du ja bereits!
Deine Datei liegt ja auf "externem Speicher" (= Festplatte, ...)
Ich wollte damit nur sagen, dass die gesamte Datei leicht größer sein kann, als du überhaupt einlesen kannst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
D Ich suche nach einer Möglickeit den Webseiten Inhalt per Java zu analysieren Automatisch Java Basics - Anfänger-Themen 3
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
S Erste Schritte Suche nach einem guten JAVA-Buch (Definition im Thread) Java Basics - Anfänger-Themen 6
S suche nach eclipse plug-in Java Basics - Anfänger-Themen 3
S Suche nach einem Programm Java Basics - Anfänger-Themen 7
A rekrusive Suche nach directories, dir Java Basics - Anfänger-Themen 10
S regular expression - suche nach | Java Basics - Anfänger-Themen 10
W Suche nach strings zwischen eckigen Klammern mittels regulärer Ausdrücke Java Basics - Anfänger-Themen 3
X Suche nach Zeichenketten Java Basics - Anfänger-Themen 9
D Suche in JList nach dem ersten Buchstaben Java Basics - Anfänger-Themen 2
V suche nach nsis script für java applikation Java Basics - Anfänger-Themen 2
A String Array: Suche nach Name -> Wert? Java Basics - Anfänger-Themen 3
S Suche nach einer bestimmten Komponente . Java Basics - Anfänger-Themen 6
Z Suche nach Liste? Java Basics - Anfänger-Themen 4
L Gezielte Infos aus Datei holen - Suche nach Position/Wort Java Basics - Anfänger-Themen 22
D hashcontains: Suche nach Objekten Java Basics - Anfänger-Themen 9
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
M Suche Resteasy Example Java Basics - Anfänger-Themen 24
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
M binäre Suche im Intervall Java Basics - Anfänger-Themen 6
M binäre Suche Java Basics - Anfänger-Themen 4
H Suche Java3D 32 bit Java Basics - Anfänger-Themen 20
amelie123456 Lineare Suche / Binäre Suche Java Basics - Anfänger-Themen 2
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
RudiRüssel Binäre Suche, unsortiert, lokales Maximum Java Basics - Anfänger-Themen 15
Y Suche von Studenten anhand Ihrer Eigenschaften. Java Basics - Anfänger-Themen 1
F Auf der Suche in π Java Basics - Anfänger-Themen 13
C Suche Nachhilfe in Java Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A suche dringend Hilfe!! Java Basics - Anfänger-Themen 6
B Suche free SVN Hosting Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
S Java Lineare-Suche Zeitmessung Java Basics - Anfänger-Themen 5
S Java Lineare Suche Java Basics - Anfänger-Themen 1
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
E Die richtige Suche in der API Java Basics - Anfänger-Themen 1
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
B Suche Programme mit Fehlern Java Basics - Anfänger-Themen 9
jaleda100 Component für Suche Java Basics - Anfänger-Themen 4
L Suche ein sampel Projekt Java Basics - Anfänger-Themen 2
P Suche Aufwandsgenerator (o-notation) Java Basics - Anfänger-Themen 1
S Suche aktuelles 2D Grafik Tutorial Java Basics - Anfänger-Themen 5
M Suche hilfe bei Array Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
D Erste Schritte Suche Quelltext Java Basics - Anfänger-Themen 7
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Suche Hilfestellung Java Basics - Anfänger-Themen 10
G Erste Schritte Suche Java Programmierer für kleines Projekt Java Basics - Anfänger-Themen 1
J Suche die Emailadresse Java Basics - Anfänger-Themen 6
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
H Erste Schritte Binäre Suche Java Basics - Anfänger-Themen 37
J Suche simples Beispiel für die EOFException Java Basics - Anfänger-Themen 1
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
L Binäre Suche Java Basics - Anfänger-Themen 2
L Linerae Suche in einem sortierten Array Java Basics - Anfänger-Themen 2
N Array, lineare Suche, binäre Suche, Programm bleibt unerwartet stehen... Java Basics - Anfänger-Themen 6
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
J Binäre Suche eines Array Java Basics - Anfänger-Themen 5
M Methoden Binäre Suche als rekursive Variante Java Basics - Anfänger-Themen 5
M Benutzerdefinierte Suche in einem String - outofbounds Java Basics - Anfänger-Themen 7
X Best Practice SUCHE ein gutes Javabuch! (kein Anfang von 0) Java Basics - Anfänger-Themen 5
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
M Rekursive Suche in einem Feld Java Basics - Anfänger-Themen 11
S Suche richtigen Typ für Variabel mit den Werten (neu, gebraucht, beschädigt) Java Basics - Anfänger-Themen 7
M Best Practice Programmierstil Graphen-A*-Suche Java Basics - Anfänger-Themen 5
M Suche Hilfe bei sehr kleinen Quelltexten Java Basics - Anfänger-Themen 2
E Suche Klasse die eine Bedinung prüft und einen von zwei Auswahlwerten zurückgibt... Java Basics - Anfänger-Themen 6
D Erste Schritte suche hilfe für db-anbindung Java Basics - Anfänger-Themen 36
S Java Servlet - Suche Java Basics - Anfänger-Themen 1
P Hashing suche Java Basics - Anfänger-Themen 4
K Suche Hilfe bei einfachem Java Code ( Debuggen ) Java Basics - Anfänger-Themen 1
M Binäre Suche Fehler überall =( Java Basics - Anfänger-Themen 2
Farbenfroh Suche Übungsaufgaben: BinaryTree, Stack Java Basics - Anfänger-Themen 0
D Binärbaum Suche Java Basics - Anfänger-Themen 5
U Vererbung Suche Hilfe anhand eines Bsp. Java Basics - Anfänger-Themen 1
L Suche Programmier-Projekt mit Anleitung Java Basics - Anfänger-Themen 3
A Suche Programmierer für Android App Java Basics - Anfänger-Themen 1
H Suche Vergleichstabelle für die Klassen String und StringBuilder Java Basics - Anfänger-Themen 1
X [SUCHE]Mitentwickler Java Basics - Anfänger-Themen 10
P Methoden suche funktion die char wert ausgibt wenn man numerischen wert und radix angibt Java Basics - Anfänger-Themen 1
D Binare Suche Java Basics - Anfänger-Themen 1
C Erste Schritte Bereich angeben bzw Fehler Suche Java Basics - Anfänger-Themen 6
L Suche in dreidimensionalen Arrays Java Basics - Anfänger-Themen 3
P Lineare Suche im Array Java Basics - Anfänger-Themen 5
X verschachtelte suche Java Basics - Anfänger-Themen 8
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
G suche den Begriff & wie programmiere ich sowas (ich ändere den Titel dann) Java Basics - Anfänger-Themen 2
M suche/brauche Links über rein GUI Beispielprogramme Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben