Toon posts:

[JAVA] bepaalde strings uit bestand in array zette

Pagina: 1
Acties:
  • 269 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
OK, ik heb het volgende probleem...

Ik heb een text bestand met daarin het volgende:
code:
1
2
3
Amsterdam, Parijs
Berlijn, Amsterdam
Rome, New York

En nu moet ik deze tekst dus in een array (matrix) krijgen, met de naam reis...

dus dan moet reis[0][0] moet dan "Amsterdam, Parijs" geven.
en reis[2][2] "Rome, New York".

Ik weet dat het mogelijk is met een filereader om de hele text in 1 string te zetten, maar ik moet het dus opsplitens.

Er moet dus gesplitst worden bij de "," en bij de "enter".
Zelf zat ik te denken om met lineReader() elke regel te lezen, zodat dus 1 string wordt, en dan in die string weer te zoeken naar de "komma". Maar ik krijg dit niet helemaal voor elkaar...

Heeft iemand een idee?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

1 woord: StringTokenizer

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Kijk eens aan wat een handige methoden * mbravenboer heeft liggen :P .

De eerste levert een lijst van Strings op, de tweede en de derde een Map op basis van bepaalde scheidingstekens.

Dit moet je zelf makkelijk aan kunnen passen naar wat jij wilt.
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
  public List<String> getList(InputStream stream) throws IOException {
    ArrayList<String> result = new ArrayList<String>();
    String s;

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

  public Map<String, String> getMap(InputStream stream) throws IOException {
      return getMap(stream, " \t\n\r\f");
    }

  public Map<String, String> getMap(InputStream stream, String sepChars) throws IOException {
    Iterator<String> lines = getIterator(stream);
    HashMap<String, String> result = new HashMap<String, String>();

    while(lines.hasNext()) {
    String line = lines.next();

    StringTokenizer tokenizer = new StringTokenizer(line, sepChars);
    result.put(tokenizer.nextToken(), tokenizer.nextToken());
    }

    return result;
  }

Uiteraard is het ook geen slecht idee om de search te raadplegen:

[topic=175056]
[topic=172821]

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


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

Vast wel heel handig die methoden, maar ik ken deze syntax niet, wat doet die?
code:
1
2
3
4
5
public List<String>

en

public Map<String, String>

Is dat een resultaat van Generics (waar ik nog steeds eens naar moet gaan kijken, klinkt heel handig)?

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
uuhm wat is een map precies???
en kan ik dat laten omzetten in een matrix (dubbele array)

zoals String[][]

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Gerco: Vast wel heel handig die methoden, maar ik ken deze syntax niet, wat doet die?
Dat zijn inderdaad Java Generics, of ook wel bekend als geparameterizeerde typen. De interface List is hier geparameterizeerd met het type String. Als je een get doet op de List of itereert over de items, hoe je niet nu niet meer te casten. Bovendien is de documenterende werking natuurlijk enorm.

De Map is geparameterizeerd met twee typen: de key en de value. In dit geval zijn het beide Strings.

Als je deze nog niet wilt of kunt gebruiken kan je de parameters gewoon weglaten, maar je moet elders dan wel casten.
klinkt heel handig?
Is ook erg handig :P .

Hier kan je de open-source early-access compiler downloaden:

http://developer.java.sun.com/developer/earlyAccess/adding_generics/

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


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Iggy: uuhm wat is een map precies???
Dat mag je lekker zelf uitzoeken :P .
en kan ik dat laten omzetten in een matrix (dubbele array)
Ja, maar je kan ook de methode aanpassen zodat er een twee-dimensionale String array wordt opgeleverd. Hoe dat moet mag je ook zelf uitzoeken omdat dat wel zo educatief is ;) .

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


Verwijderd

Topicstarter
hehe, zal wel lukken denk ik

in ieder geval bedankt ;)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je even naar mijn posts hier kijkt word je zowaar nog blijer:

[topic=175205]

Deze 'newbie' heeft exact hetzelfde probleem ;) .

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


Verwijderd

Topicstarter
ik heb hem toevallig net helemaal doorgelezen....

en volgens mij gaat dat perfect lukken...
alleen hij zet de rijen standaard op 10, hoe kan ik dit nu uit de file lezen?
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
public static String[][] getString(File file, int width) throws IOException, FileNotFoundException
    {
      int rij = 0;
      String line = "";
      String[][] result = new String[10][width];
      StringTokenizer st;
      FileInputStream fileInput = new FileInputStream(file);
      BufferedReader data = new BufferedReader(new InputStreamReader(fileInput));
   while ((line = data.readLine()) != null)
{
   int kol = 0;
   st = new StringTokenizer(line);
   while (st.hasMoreTokens())
   {
     result[rij][kol] = st.nextToken();
     kol++;
   }

   rij++;
}



      fileInput.close();
      return result;
    }

Die "String[][] result = new String[10][width];" bedoel ik dus ;)

  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Je moet een ArrayList gebruiken, die wordt groter als dat nodig is. :)

Verwijderd

Topicstarter
hoe bedoel je dat?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

Wat is een ArrayList dan anders als een Vector? Om je heel eerlijk te zeggen heb ik nog nooit van een ArrayList gehoord, maar zo te horen doet 'ie precies hetzelfde.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
ArrayList is nieuw (1.2), Vector is oud(er), zover ik de sun documentatie begrijp.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het enige verschil daartussen is dat de Vector volgens mij synchronized is en de ArrayList niet dus het ligt eraan of dat nodig is of niet. Als dat niet nodig is scheelt het natuurlijk weer performance

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
hoe zorg ik er dan voor dat dezelfde lijn op delzefde rij komt?

ik zat hieraan te denken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ArrayList result = new ArrayList();

StringTokenizer st;
      FileInputStream fileInput = new FileInputStream(file);
      BufferedReader data = new BufferedReader(new InputStreamReader(fileInput));
   while ((line = data.readLine()) != null)
{
   st = new StringTokenizer(line);
   while (st.hasMoreTokens())
   {
     result.add = st.nextToken();
     
   }
   
}

Of maak ik er nu helemaal verkeerd gebruik van?

(eigenlijk wil ik die String[][] gebruiken, maar gaat dit wel als ik niet van tevoren weet hoeveel rijen de file heeft?)

Verwijderd

Topicstarter
hmmm net beter naar die ene draad zitten kijken van die newbie....

en dit zou opzich dus wel moeten lukken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String[][] getStringArray2D(File file, int width)  throws IOException, FileNotFoundException
    {
        List lines = getList(file);

        String[][] result = new String[lines.size()][width];
        for(int i=0;i<lines.size();i++)
        {   
            String line = (String)lines.get(i);

            StringTokenizer tokenizer = new StringTokenizer(line);
            for(int j=0;j<width;j++)
            {
                result[i][j] = tokenizer.nextToken();
            }
        }

        return result;
    }
}
Pagina: 1