[JAVA] Regelnummers bij importeren

Pagina: 1
Acties:

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 17-09 16:32

Kaastosti

Vrolijkheid alom!

Topicstarter
Hey allemaal,

Ik ben bezig met het importeren van stukken tekst uit een extern bestand. Probleem hierbij is, dat ik er niet achter kan komen, hoe ik er voor kan zorgen dat JBuilder maar 1 regel uitleest.

Het idee is dit:
Op een regel in het tekstbestand staan 7 woorden.
woord1woord2woord3woord4woord5woord6woord7
In het tekstbestand staan zo'n 50 dergelijke regels, waarvan ik er eentje met Math.random uitkies.

Deze hele regel wil ik importeren als een String,
waarna ik 'm binnen de Applet onder kan verdelen in woorden in een array. De woordlengtes zijn steeds even groot, dus dat is het probleem niet.

Wat lukt er niet:
Het importeren van 1 enkele regel, welke random gekozen wordt. Dus als ik regel 23 wil hebben.

Als iemand hier een oplossing voor weet, graag :)
Bij voorbaat dank!

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik herhaal mijn tip :)

Hier ( [topic=172821] )
staat hoe je je bestand kan inlezen in een List van Strings.
Daarna kan je met Math.random een index in die List kiezen en de String eruit halen.

Dus: waar lukt het niet?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Wat mij de handigste oplossing lijkt is eerst alle regels importeren naar een array, en daar een regel uit kiezen at random.

Maar over de vraag hoe weet je nou wanneer het een regel is? Aan het eind van een regel staat het character '/n' of '/r' of allebij. Je kunt ook kijken naar een StreamTokenizer.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
while(niet_gevonden_enter)
{
$woord.=leesletterin()
}


Oftewel, letters inlezen totdat je een enterteken tegenkomt.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Deze methode moet je dus hebben:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * Returns an List with the contents of the specified file.
 *
 * @param file the file to read
 */
public static List getList(File file) throws IOException, FileNotFoundException
{
   List result = new ArrayList();
   String s;

   FileInputStream fileInput = new FileInputStream(file);
   BufferedReader data = new BufferedReader(new InputStreamReader(fileInput));
     
   while((s = data.readLine())!=null)
   {
    result.add(s);
   }
      
   fileInput.close();
   return result;
}

Hierna is het toch niet meer moeilijk?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Voor de puristen die vinden dat het inlezen van een hele file niet mooi is, nog een betere en toch generieke oplossing :) .

Ik de methode nu geparameterizeerd met een ContentHandler. Deze handelt de regels af. Ik heb een implementatie gemaakt die regel nummer x oplevert...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.*;

public class FileReader
{
    public void read(File file, ContentHandler handler) throws IOException, FileNotFoundException
    {
        FileInputStream fileInput = new FileInputStream(file);
        BufferedReader data = new BufferedReader(new InputStreamReader(fileInput));

        String s;
        boolean proceed = true;
     
        while((s = data.readLine())!=null && proceed)
        {
            proceed = handler.handle(s);
        }
      
        fileInput.close();
    }
}

De interface:
code:
1
2
3
4
public interface ContentHandler
{
    public boolean handle(String line);
}

De implementatie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class LineReader implements ContentHandler
{
    private int _lineIndex;
    private int _nextIndex;

    private String _result;

    public LineReader(int lineIndex)
    {
        super();
        _nextIndex = 0;
        _lineIndex = lineIndex;
    }

    public boolean handle(String line)
    {
        boolean proceed;

        if(_nextIndex == _lineIndex)
        {
            _result = line;
            proceed = false;
        }
        else
        {
            proceed = true;
        }

        _nextIndex++;
        return proceed;
    }

    public String getResult()
    {
        return _result;
    }
}

Ik heb het niet getest dus er kan een klein foutje in zitten, maar het zal vast wel ongeveer werken :) . Uiteraard kan je de eerste methode die een List inleest uitdrukken door een simpele ContentHandler te schrijven.

Je hoeft nu alleen nog maar de zaak te initialiseren en Math.random aan te roepen en je hebt een supersnelle oplossing :) .

Edit: voor de XML freaks: ja dit is SAX ;)
Edit2: Oeps, grof foutje ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hij werkt goed :) .

Heb nog ff een test geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    public static void main(String[] ps)
    {
        try
        {
            LineReader reader = new LineReader(0);
            new FileReader().read(new File("LineReader.java"), reader);
            System.out.println("Result: " + reader.getResult());
        }
        catch(Exception exc)
        {
            exc.printStackTrace();
        }
    }

Heb jij ff mazzel met mijn verveling ;)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Let op: hij telt vanaf 0....

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Is het gelukt of is er nog iets onduidelijk?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment

Pagina: 1