Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[Java] Geen output buiten loop *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor school ben bezig om vanuit een tekstbestand (.txt) een tekst in te lezen, zodat ik deze later kan omzetten met behulp van een mono-alfabetisch substitutie systeem in een gecodeerde tekst. De tekst inlezen in een String heb ik op de volgende manier gerealiseerd:

Java:
1
2
3
4
5
BufferedReader bfr = new BufferedReader(new FileReader("C:\tekst.txt"));
String buffer, result = "";
while((buffer = bfr.readLine()) != null){  
  result = result + buffer.toLowerCase();
}


Het substitutie systeem heb ik gerealiseerd door middel van een HashMap waarbij elke letter van het alfabet een sleutel is en een andere letter de waarde. Voor de eenvoud maak ik even gebruik van het meest simpele: {a=b, b=c}.

Wanneer ik een nieuw string aanmaak en de letters vervangen in een loop en de output buiten de loop naar de console print geeft deze geen enkele output.

Java:
1
2
3
4
5
6
7
8
9
10
11
String nieuw = new String(); // Nieuw String om mee te werken 
                
for(int i = 0; i <= result.length(); i++){ // Loop net zolang tot alle karakters in de string zijn geweest
    String karakter = result.substring(i, i+1).toString(); // Verkrijg karakter dmv substring
       if(letters.containsKey(karakter)){
    nieuw = nieuw + letters.get(karakter); // letters = HashMap met substitutie systeem
       }
       else{
      nieuw = nieuw + karakter;
      }     
}


Mijn vraag is of iemand weet waarom er geen nieuwe output wordt gegenereerd als ik de de string print buiten de loop? Ik heb al verschijdene dingen geprobeerd zoals het gebruik van een StringBuffer, maar deze geeft precies hetzelfde probleeem. Ik hoop dat er iemand is die kan helpen want ik staar mij hier een beetje blind op! 8)7 Bij voorbaat dank.

[ Voor 10% gewijzigd door een moderator op 14-09-2008 23:59 . Reden: Code tags toegevoegd... ]


  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Ik spreek helaas geen Java, alleen C++, maar die C:\ in een string kan in C++ echt niet omdat de compiler denkt dat je dan dingen wil escapen. Misschien moet je daar in Java ook een dubbele backslash voor gebruiken?

Daarnaast is dit een geweldig voorbeeld om een debugger voor te gebruiken (ik neem voor het gemak maar even aan dat zoiets bestaat in de Javawereld), dan heb je binnen een paar seconden de oplossing voor je probleem gevonden, daar heb je ons hier helemaal niet voor nodig :)

btw. Je kan code-tags gebruiken om je code op dit forum te plaatsen, dan is het wat beter te lezen

[ Voor 16% gewijzigd door Stukfruit op 14-09-2008 23:53 ]

Dat zit wel Schnorr.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14-11 23:57

.oisyn

Moderator Devschuur®

Demotivational Speaker

\t is idd het tab character.

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.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Blind staren is not the way to go. Use the force Luke: use a debugger :Y) ;)
En als je die niet hebt, zijn er ook andere manieren om te debuggen (zoals tussentijds variabelen afdrukken): Debuggen: Hoe doe ik dat?. Wat Stukfruit op gut-feel en .oisyn al op kennis zo weten aan te geven is dat C:\test.txt niet gelezen gaat worden; daar was je met een debugger (of met debuggen) zo achter geweest en dan had je niet naar het verkeerde stuk code zitten staren.

Verder wil ik je even wijzen op onze code tags ;)

[ Voor 24% gewijzigd door RobIII op 15-09-2008 00:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Daarnaast is het niet zo handig om excepties te negeren. Je zou in dit specifieke geval een
code:
1
java.io.FileNotFoundException: C:   ekst.txt
moeten hebben ontvangen, wat op termijn een lichtje had moeten doen branden.

Heb je lege catch blokken of doe je totaal niks met de gevangen exceptie? Nooit doen zolang je niet weet waar je mee bezig bent. Werp de exceptie. Of doe tenminste e.printStackTrace().

[ Voor 29% gewijzigd door BalusC op 15-09-2008 01:35 ]


Verwijderd

Nog even los van de terechte opmerkingen die hierboven al gemaakt zijn, zijn er m.i. nog een paar andere dingen die beter kunnen aan de code.

Een String in Java is een immutable object. Hier gebruik je Strings om een groeiende hoeveelheid data vast te houden (variabelen result, nieuw). Als je dan zoiets doet als result = result + buffer, dan wordt er een volledig nieuwe String gealloceerd met de inhoud result + buffer, deze wordt toegewezen aan variabele result, en de oude result is dan klaar voor garbage collection omdat er geen referentie meer naar bestaat. Dit is een heel inefficient proces. Het betere alternatief is om voor dit doel een StringBuilder te gebruiken in combinatie met de append method.

Verder gebruik je ook Strings om individuele karakters mee op te slaan. In beginsel heb je daarvoor de char in Java. Je kunt gewoon zeggen char karakter = result.charAt(i). Je Map kan geen chars bevatten (want geen reference type), maar wel Characters. Via autoboxing/unboxing (sinds Java 5) zal de conversie tussen char en Character automatisch gaan.
Pagina: 1