Toon posts:

[Java] Eigen datatype in een array, hoe of wat?

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

Verwijderd

Topicstarter
Ik ben bezig via java een bestand uit te lezen met woorden er in.
Het bestand aanroepen en inlezen om vervolgens gewoon weer af te drukken, dat lukt.

Nu wil ik al die woorden in een array laden en vervolgens via random() een willekeurig
woord te laten kiezen.

Het probleem is dat de woorden blijkbaar niet in de array komen.
Dat komt voornamelijk omdat ik totaal niets begrijp van die eigen datatypes, en
ik kan er ook niks over vinden omdat ik niet goed weet hoe het heet.

Dit is mijn code (stukje)
Java:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class Woordenlijst {
    
    private int aantalWoorden=0;
    private int maxAantalWoorden=5000;
    Woord[] woorden;
    BufferedReader infile = null;
    String inLine;
    
    public Woordenlijst() {
        woorden = new Woord[maxAantalWoorden];
    }
    
    public void maakWoordenLijst() {
        File file = new File("\\", "woorden.txt");
        System.out.println("Bestaat het bestand? " + file.exists());
        System.out.println("Kan het bestand gelezen worden? " + file.canRead());
        System.out.println("Wat is het absolute pad? " + file.getAbsolutePath());
        
        try {
            infile = new BufferedReader(new FileReader(file));
            
            int i = 0;
            while ((inLine = infile.readLine()) != null) {
                System.out.println(i + ": " + inLine);
                woorden[i] = new Woord(inLine);  // <<<-----------
                i++;
            }
        }
        catch (FileNotFoundException ex) {
            System.out.println("File not found");
        }
        catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        finally {
            try {
                if (infile != null) {
                    infile.close();
                }
            }
            catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    
    public Woord getWillekeurigWoord() {
        double i = (Math.random() * 1000);
        int j = (int)i;

        System.out.println("Random getal: " + j);
        Woord test = woorden[j];     // <<<------
        System.out.println("Woord: " + woorden[j]);

        return test;
    }
    
}


ik heb dus methods van het type Woord en Letter en dat soort dingen.
Maar wat moet ik er nou precies mee, hoe zet ik dat weer om naar een String waarde?
De met pijltjes gecommente items zijn de punten die het probleem geven in mijn ogen

[ Voor 8% gewijzigd door Verwijderd op 27-09-2005 11:47 . Reden: [b] syntax gewijzigd ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Met de code die hier staat is volgens mij weinig mis. Het probleem zit sowieso niet in de door jou als bold aangegeven stukken (het is makkelijker trouwens om er even een //<--------- achter te zetten. Dan blijft de syntax valide en dat is duidelijker dan de niet werkende bold tags)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Janoz schreef op dinsdag 27 september 2005 @ 11:45:
Met de code die hier staat is volgens mij weinig mis. Het probleem zit sowieso niet in de door jou als bold aangegeven stukken (het is makkelijker trouwens om er even een //<--------- achter te zetten. Dan blijft de syntax valide en dat is duidelijker dan de niet werkende bold tags)
Het probleem zit hem in die door mijzelf gedefinieerde data typen. Ik weet niet hoe ik daar mee moet werken. Ik wil dat Woord type omzetten naar String, maar ik krijg het niet voor elkaar.
Maar weet ook niet of dat wel moet.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Ah, maar dan gaat het dus helemaal niet fout bij het toekennen of in de arrays, maar bij het afdrukken.

Je zou een toString() methode kunnen implementeren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • mandroid
  • Registratie: Juli 2002
  • Laatst online: 01-02 07:50
Heb je in de klasse Woord de methode toString geïmplementeerd ?

Verwijderd

Topicstarter
lord-evil schreef op dinsdag 27 september 2005 @ 11:52:
Heb je in de klasse Woord de methode toString geïmplementeerd ?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Woord {
    
    Letter[] letters;
    
    public Woord(String regel) {
    }
    
    public String toString() {
        return null;
    }
    
    public Letter getLetter(int i) {
        return null;
    }
    
}


Ja, ik heb m wel ja :)
Maar ik ben echt even helemaal kwijt hoe ik het daarmee op moet lossen

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Tja, als de toString methode null oplevert, dan is het ook niet zo gek dat er waarschijnlijk null wordt afgedrukt.

Wanneer je een System.out.println(woord) doet wordt op woord de toString functie gebruikt. Elk object heeft deze aangezien Object (waar alles van extend) deze heeft. Jij laat deze echter null terug geven. Dus wordt null afgedrukt.

Misschien is het handiger om Woord daadwerkelijk eens te gaan implementeren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

/me ontgaat het nut van Woord en Letter als je niets meer doet dan wat String en Char al kunnen

De implementatie van Woord doet nu helemaal niets nuttigs. De constructor doet niets met de meegegeven string, en toString zal met return null natuurlijk niets nuttigs opleveren.

Misschien moet je even terug naar de tekentafel en bedenken wat je wil bereiken, en dat even in een OO boek duiken en kijken hoe je dat het beste kan ontwerpen, en dan in een Java boek duiken voor de beste syntax. Eerlijk gezegd denk ik dat je Woord beter kan overerven van String, en dan wat eigen functies kan toevoegen.

Verwijderd

Topicstarter
Ja ik ben ook helemaal geen fan van Woord en Letter
maar ik heb de UML designs gekregen, dus daar moet ik me aan houden.

Dat return null ga ik wel even naar kijken ja *schaam*

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
idd implementeer je Woord class eens goed. Je doet bijvoorbeeld niks met de string die je in je constructor meegeeft. En je toString returnt null en dat drukt hij dan dus ook af ( Niks dus )

zet de volgende toString eens in je class dan zal je zien dat hij al meer doet
Java:
1
2
3
public String toString() { 
        return "Blaat"; 
    }


[edit]
mmm mischien eerst een keer refreshen voordat ik reageer ;)
Ja ik ben ook helemaal geen fan van Woord en Letter
maar ik heb de UML designs gekregen, dus daar moet ik me aan houden.
als je de UML designs hebt gekregen en je je daar aan moet houden dan moet je het wel implementeren. Het is niet zo dat Java automatisch kan ruiken dat je je inputstring in je Array van chars moet zetten. Dat zul je toch echt zelf moeten doen.

[ Voor 41% gewijzigd door Woy op 27-09-2005 12:10 ]

“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
rwb schreef op dinsdag 27 september 2005 @ 12:08:
idd implementeer je Woord class eens goed. Je doet bijvoorbeeld niks met de string die je in je constructor meegeeft. En je toString returnt null en dat drukt hij dan dus ook af ( Niks dus )

zet de volgende toString eens in je class dan zal je zien dat hij al meer doet
Java:
1
2
3
public String toString() { 
        return "Blaat"; 
    }


[edit]
mmm mischien eerst een keer refreshen voordat ik reageer ;)


[...]

als je de UML designs hebt gekregen en je je daar aan moet houden dan moet je het wel implementeren. Het is niet zo dat Java automatisch kan ruiken dat je je inputstring in je Array van chars moet zetten. Dat zul je toch echt zelf moeten doen.
Ja dat was het inderdaad, krijg nu in elk geval "blaat" terug.

Maar hoe pas ik dat nou in bij deze regel.
Woord test = woorden[j];

Hij moet dan die toString() functie gebruiken, maar de aanroep, hoe gaat dat dan?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom wil je daar toString gebruiken? Je haalt een Woord op uit de array, en stopt die in een Woord variabele. Daar is toch helemaal geen tussenkomst van toString() voor nodig?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
idd. Pas op de regel
Java:
1
System.out.println("Woord: " + woorden[j]); 

wordt toString impliciet aangeroepen. Je zou het ook zo kunnen lezen
Java:
1
System.out.println("Woord: " + woorden[j].toString()); 

Ik denk dat het handig is dat je er nog een keer een goed boek bij pakt want volgens mij snap je nog niet zoveel van OO

“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
rwb schreef op dinsdag 27 september 2005 @ 12:25:
idd. Pas op de regel
Java:
1
System.out.println("Woord: " + woorden[j]); 

wordt toString impliciet aangeroepen. Je zou het ook zo kunnen lezen
Java:
1
System.out.println("Woord: " + woorden[j].toString()); 

Ik denk dat het handig is dat je er nog een keer een goed boek bij pakt want volgens mij snap je nog niet zoveel van OO
Daar heb je gelijk in!
Maar dat afdrukken werkt dus niet.
En ik dacht, als ik nou een voorbeeld heb van hoe het wel moet, dan snap ik het waarschijnlijk wel.

Wat ik wil weten is wat ik bij mijn toString() als return waarde moet zetten.
Dan werkt het volgens mij..

[ Voor 10% gewijzigd door Verwijderd op 27-09-2005 12:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat voorbeeld zul je hier niet vinden, ik gok ook dat het een schoolopdracht is en dan is een kant-en-klare oplossing helemaal uit den boze.

Wat je moet doen is je Woord.toString op een zinnige manier implementeren. Dat wil dus zeggen dat je geen null of "Blaat" moet returnen, maar je array van Letters in dat woord om moet zetten naar een String. Ik neem aan dat een Letter op een of andere manier te converteren is naar een char, dan hoef je simpelweg al die chars achter elkaar te plakken in een String, en die te returnen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 10:48

Robtimus

me Robtimus no like you

Verwijderd schreef op dinsdag 27 september 2005 @ 12:04:
Eerlijk gezegd denk ik dat je Woord beter kan overerven van String, en dan wat eigen functies kan toevoegen.
public final class String O-)
rwb schreef op dinsdag 27 september 2005 @ 12:08:
idd implementeer je Woord class eens goed. Je doet bijvoorbeeld niks met de string die je in je constructor meegeeft. En je toString returnt null en dat drukt hij dan dus ook af ( Niks dus )
Nou niet niks. Intern wordt er door een printstream niet object.toString() aangeroepen maar String.valueOf(object). En dat is weer (obj == null ? "null" : obj.toString()). Dus er wordt "null" geprint.

Edit: wel niks |:(
object is niet null maar zijn toString wel. Sterker nog, in printstream gaat het dan volgens mij zelfs behoorlijk fout:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public void print(Object obj) {
    write(String.valueOf(obj));
    }

    private void write(String s) {
    try {
        synchronized (this) {
        ensureOpen();
        textOut.write(s); // <--------- NullPointerException
        textOut.flushBuffer();
        charOut.flushBuffer();
        if (autoFlush && (s.indexOf('\n') >= 0)) // <--------- NullPointerException
            out.flush();
        }
    }
    catch (InterruptedIOException x) {
        Thread.currentThread().interrupt();
    }
    catch (IOException x) {
        trouble = true;
    }
    }

[ Voor 33% gewijzigd door Robtimus op 27-09-2005 12:41 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hebt een array met Letters ( Die je overigens nog niet vult dus dat zul je ook nog moeten doen ). Die letters zul je in je toString op een of andere manier om moeten zetten naar een string dus bijvoorbeeld als volgt
Java:
1
2
3
4
string retVal;
for( int i = 0; i < letters.length; i++ ){
    retVal += letters[ i ].toString();
}

Je moet dan wel zorgen dat je Letter class ook een goede toString heeft. Maar zoals je je code nu gepost hebt is die nog verre van compleet.

“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.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
IceManX schreef op dinsdag 27 september 2005 @ 12:36:
Nou niet niks. Intern wordt er door een printstream niet object.toString() aangeroepen maar String.valueOf(object). En dat is weer (obj == null ? "null" : obj.toString()). Dus er wordt "null" geprint.
Ok dat wist ik niet. Maar ik vindt het trouwens wel vreemd. Null betekend dat er naar "Niks" verwezen word dus dan zou ik het logisch vinden dat er niks geprint word.

“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.”


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:11
Zoals al gezegd, klopt de constructor van je Woord klasse niet. Als jij een String regel in je constructor definieert, moet je er ook daadwerkelijk iets mee doen.

Roomba E5 te koop


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 10:48

Robtimus

me Robtimus no like you

rwb schreef op dinsdag 27 september 2005 @ 12:41:
[...]

Ok dat wist ik niet. Maar ik vindt het trouwens wel vreemd. Null betekend dat er naar "Niks" verwezen word dus dan zou ik het logisch vinden dat er niks geprint word.
Zie mijn edit: dat stuk code geldt alleen als het Woord null zou zijn.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
IceManX schreef op dinsdag 27 september 2005 @ 12:42:
[...]
Zie mijn edit: dat stuk code geldt alleen als het Woord null zou zijn.
maar als je System.out.println( null ); zou doen dan wordt er dus "Null" geprint? Dat vind ik nog steeds vreemd.

“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

IceManX schreef op dinsdag 27 september 2005 @ 12:36:
[...]
public final class String O-)
[...]
D'oh! |:(

@Livors: de implementatie van de Woord class is dus verre van compleet. Je hebt alleen de body van de methodes en constructor neergezet, maar deze doen nog niets nuttigs. Daarnaast heb je een array met Letters gedeclareerd, maar nog niet geinstantieerd.

Het idee is dat je in de constructor de array met letters instantieerd en de letters uit de meegegeven string in stopt. In de .toString moet je dan deze letters weer tot 1 string samenbrengen en teruggeven. Concentreer je dus eerst op deze twee taken.

Succes :)

[ Voor 61% gewijzigd door Verwijderd op 27-09-2005 13:07 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
offtopic:
Wat is het nut van het final keyword? Ik weet wel wat het doet, maar waarom je het zou gebruiken weet ik niet. Mischien dat het bij de declaratie van constanten (jammer dat daar geen aparte keyword voor bestaat, net als ik c++) handig is, maar verder vind ik het alleen maar irritant. :P

Noushka's Magnificent Dream | Unity


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Michali schreef op dinsdag 27 september 2005 @ 13:28:
Wat is het nut van het final keyword?
Je krijgt de garantie dat de waarde nooit meer aangepast kan worden. Persoonlijk maak ik alles final wat niet aanpasbaar hoeft te zijn (zeker aangezien ik veel met multithreaded problematiek bezig ben).

Verder gaat de vm anders om gaan met finals dan non finals. (oa optimalisaties) en ook allerlei code checks kan je erop laten uitvoeren. Bv fields die in een multithreaded omgeving gebruikt worden, en niet gesynchroniseerd zijn, die moeten volatile of final zijn. Je zou met een code checker je code op dit soort mogelijke fouten kunnen controleren.

Verder maak ik classes ook altijd final als ze niet gedesgined zijn om ge-extend te worden.

[ Voor 9% gewijzigd door Alarmnummer op 27-09-2005 13:55 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Voorbeeldje van final:

Ik heb een keer een security laag ingebouwd in een struts applicatie. Hierbij heb ik de Action class ge-extend.

De implementatie zag er ongeveer zo uit:
Java:
1
2
3
4
5
6
7
8
9
public final Forward execute(mapping, form, request, response) {
  if (validateAction()) {
    return secureExecute(mapping, form, request, response);
  } else {
    throw new SecurityException()
  }
}

protected abstract Forward secureExecute(mapping, form, request, response);


Op deze manier is te garanderen dat methodes die secureAction implementeren altijd secure zijn en niet stiekum execute extenden.

[ Voor 3% gewijzigd door Janoz op 27-09-2005 14:27 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Een mooi voorbeeld van een template method idd. Methodes final maken in dit soort situaties is imho ook aan te raden.

Verwijderd

Livors,

Waar is de main methode waar de andere methodes worden aangeroepen? Toen ik nog in Java programmeerde, had ik een main waarin ik alle methodes bij elkaar liet komen, of tenminste 1 relevante.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 27 september 2005 @ 15:14:
Livors,

Waar is de main methode waar de andere methodes worden aangeroepen? Toen ik nog in Java programmeerde, had ik een main waarin ik alle methodes bij elkaar liet komen, of tenminste 1 relevante.
Dat is hier toch helemaal niet relevant? Tuurlijk zal hij in zijn main methode iets moeten doen waardoor zijn programma gaat draaien. Maar dat is niet het probleem wat hij heeft.

“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

Ik dacht dat hij al zijn code had geplaatst...ik vind het voor mezelf handiger om vanuit main te werken en van daaruit de methodes te maken. Dan weet je gelijk hoe een methode gebruikt gaat worden...ik denk dat Livors een probleem heeft met het aanroepen en gebruiken van methodes.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 27 september 2005 @ 15:42:
Ik dacht dat hij al zijn code had geplaatst...ik vind het voor mezelf handiger om vanuit main te werken en van daaruit de methodes te maken. Dan weet je gelijk hoe een methode gebruikt gaat worden...ik denk dat Livors een probleem heeft met het aanroepen en gebruiken van methodes.
Nee want zoals je kan lezen wordt de code wel uitgevoerd.

En ik weet niet wat jij allemaal in je main methode zet maar bij mijn applicaties staat daar eigenlijk nooit veel meer dan iets als het volgende
Java:
1
2
MyApplication app = new MyApplication();
app.Start();


de main methode is nou niet echt een handige plek om grote lappen code neer te gaan zetten.

“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.”

Pagina: 1