Προς το περιεχόμενο

Java:Δε μπορω να ξεχωρίσω την πρώτη λέξη απο ένα String


Sadako

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπόν, το θέμα έχει ως εξής: Έχω ένα απλό αρχείο κειμένου. Αυτό που θέλω να κάνω, είναι να ξεχωρίσω την πρώτη λέξη απο κάθε γραμμή, γιατί ανάλογα με αυτό θα χειριστώ τη γραμμή στο πρόγραμμα μου.

 

Ανοίγω λοιπόν το αρχείο με randomaccessfile (δοκίμασα και με bufferedreader, δε νομίζω ότι εκεί είναι το πρόβλημα), και απο κει με το

while (( line=rfile.readLine() ) != null)

διαβάζω κάθε γραμμή διαδοχικά..

 

Στην αρχή σκέφτηκα να σπάσω τη γραμμή με το stringtokenizer, και να πάρω το πρώτο token απο κάθε γραμμή και να το συγκρίνω με τις λέξεις που θέλω. Η δεύτερη σκέψη μου ήταν να ψάξω την πρώτη λέξη σαν substring ολόκληρης της γραμμής, ξεχωρίζοντας το τέλος της απο την πρώτη εμφάνιση του " ". Και στις 2 περιπτώσεις όμως έχω πρόβλημα, γιατι στο αρχείο κάποιες γραμμές είναι κενές. Και εκεί μου πετάει exception.. Δηλαδή το αρχείο μοιάζει κάπως έτσι

 

-- start of file

-- line 1

yes

read K2

 

line 2

end

 

Οπότε μόλις φτάνει στην 4η turn του loop, πετάει runtime error..

 

Ο μόνος τρόπος που κατάφερα να το κάνω (που θεωρώ και κάπως μπακαλίστικο), είναι να δηλώσω manually το substring. Δηλαδή σε περίπτωση που θέλω να πάρω τη λέξη read, να κάνω:

if (line.substring(0,3).equals("read")) κλπ (όπου line είναι το η κάθε γραμμή, σε μορφή string).

Εκεί όμως είχα πρόβλημα με γραμμές μικρότερες απο 4 χαρακτήρες. Δηλαδή μόλις έφτανε στο yes στην 3η γραμμή, πετούσε exception, και λογικά, γιατί δεν υπάρχει 4ος χαρακτήρας στη γραμμή. Οπότε αναγκάστηκα να βάλω και ένα if πιο πριν, να ελέγχει μόνο τις γραμμές με μήκος πάνω απο 4. Δεδομένου όμως ότι θέλω να έχω πολλές περιπτώσεις ανάλογα με την πρώτη λέξη, δε μπορώ να το επαναλαμβάνω αυτό συνέχεια, γιατί οι λέξεις-κλειδιά, που είναι οι πρώτες λέξεις κάθε γραμμής έχουν διάφορα μήκη..

 

Ελπίζω να έγινα κατανοητός, γιατί δεν κοιμάμαι και πολύ καλά τώρα τελευταία.. :-?

Δημοσ.

Η λύση του Dikemou είναι λάθος γιατί στην περίπτωση που στην γραμμή που διαβάζεις υπάρχει μόνο μια λέξη (δεν υπάρχει το κενό " ") τότε το line.indexOf(" ") θα επιστρέψει -1 και στο String firstWord θα προσπαθήσει να βάλει το line.substring(0,-1) κάτι που θα οδηγήσει σε Exception : StringIndexOutOfBoundsException.

 

Η λύση του djapal είναι πιο σωστή αλλά παρουσιάζει και αυτή κάποια προβλήματα.

1. δεν κάνει έλεγχο για το αν το String line είναι κενο string ("") κάτι που θα οδηγήσει και εδώ στο ίδιο exception σε περίπτωση που διαβάσεις μια γραμμή κενή.

2. σε περίπτωση που είτε η γραμμή αρχίζει με κενό " " τότε πάλι θα δημιουργηθεί πρόβλημα.

3. σε περίπτωση που θέλεις να διαβάσεις τις επόμενες λέξεις και ενδιάμεσα απο αυτές υπάρχουν περισσότερα κενά " " απο ένα τότε θα πάρεις σαν αποτέλεσμα κενές λέξεις.

π.χ line = "test 1 3" (ανάμεσα στο 1 και το 3 υπάρχουν 2 κενά)

αποτέλεσμα :

lineWords[0] = "test"

lineWords[1] = "1"

lineWords[2] = ""

lineWords[3] = "3"

 

Η λύση που θα σου προτείνω βασίζεται στο StringTokenizer και είναι :

....

>while (( line=rfile.readLine() ) != null) {
      StringTokenizer tok = new StringTokenizer(line);
      if(tok.countTokens() > 0) {
              firstWord = tok.nextToken();
              //Gia tin epomeni leksi
              if(tok.hasMoreTokens()) {
                       secondWord = tok.nextToken();
              }
              .....
        }
}

Δημοσ.

Telika akolouthisa diaforetikh proseggish kai vrhka tropo na anagnwrizw to pws arxizei to string pou apotelei thn grammh (to ekana me "line.matches())

To provlhma pou exw twra, einai oti thelw na valw enan elegxo etsi wste na elegxei mono tis grammes pou periexoun ena string. Dhladh skefthka na valw ena if, etsi wste na elegxei oles tis grammes, ektos apo autes pou einai adeies (dhladh exei apla pathsei enter o typos kai phge sthn epomenh grammh), 'h periexei mono kapoio space 'h kapoio tab.

 

Dokimasa na valw diadoxika

if (line.length() > 0)

if(!line.equals(""))

if(!line.equals("\n")

 

alla den doulepse tipota.. kamia idea??

Δημοσ.

Στον κώδικα που σου έχω γράψει παραπάνω υπάρχει η λύση στο πρόβλημα που περιγράφεις.

>if(tok.countTokens() > 0) {
     .....
} [b][color="Navy"]else {
     // Η γραμμή είναι κενή ή περιέχει μονο tabs ή μονο spaces
}[/color][/b]

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...