21. september 2008 - 20:20Der er
33 kommentarer og 1 løsning
Konverter romertal fra inputfil til arabiske tal
Jeg skal bruge et program, som indlæser en række af romertal, defineret nedenfor, fra en fil og udskriver de tilsvarende numeriske værdier (dvs. sædvanlige arabiske tal) i sorteret rækkefølge efter deres numeriske værdi.
Inputfilen er formateret således: V X VII VI III V IV IX II VII
Så skulle udskriften meget gerne være sådan, så jeg får præcis ét heltal svarende til romertal i inputtet, på hver linje, sorteret efter deres numeriske værdi: 2 3 4 5 5 6 7 7 9 10
Nogen der kan hjælpe mig med dette? Har ikke umiddelbart kunne finde noget på google, der kunne bruges tilpræcis dette formål, kun færdige convertes, der konvertere ud fra brugerinput. Er ikke selv helt skarp til Java nemlig, men er dog i gang med at lære det.
Saa skal du: - laese input filen en linie ad gangen - konvertere fra romertal til normal tal med decodeString ovenfor - gemme i en ArrayList<Integer> - sortere denne - udskrive den til en ny fil
Der ser da fint ud det der. Må indrømme jeg nogenlunde forstår koden når jeg læser den, kan godt se logikken i det osv., men rammer lidt muren med dit anden indlæg.
Hvordan skal jeg fortælle programmet (din kode) at det fx er "romertal.txt" filen den skal læse fra, og hvordan kun en linie af gangen? (og kan denne fil egentlig bare gemmes som .txt eller skal dette også være java?) Kan ikke gennemskue med hvad det er jeg skal konvertere? Altså er det "ix" jeg skal kalde?
Sortering? Det skal jeg nok finde ud af, det kan en googlesøgning vel godt svare mig på.
Når jeg udskriver til en ny fil, så er det noget i retning af
out = new FileOutputStream("minfil.txt");
, right? Og kan denne også godt nøjes med at være .txt ?
decodeChar - fra min klasse decodeString - fra min klasse main - lav ArrayList<Integer> laes ind fra fil med while loekke (se kode skitsering) sorter udskriv til fil med for loekke (se kode skitsering)
Jamen hvordan får jeg så de konverterede tal i min array? Altså, hvordan skal det se ud til i det hele?
i min main der skal jeg have ArrayList<Integer> og hvordan fortæller jeg den at jeg skal gemme de tal der bliver konverteret? Eller er det først efter while løkken?
Er det rigtigt indtil videre? Og hvad skal jeg så? Forstår stadig ikke hvordan jeg skal implementere det med ArrayList, og hvordan jeg så skal få denne sorteret.
public class RomanToArabic { private static int decodeChar(char c) { switch(c) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default: throw new IllegalArgumentException(c + " is not a roman digit"); } } public static int decodeString(String s) { int acc = 0; int ix = 0; while(ix < s.length()) { if(ix < s.length() - 1 && decodeChar(s.charAt(ix)) <
Man kan også løse problemet med recursion. men her er et lille program der efter hvad jeg forstår skulle kunne løse problemet:
import java.io.*; import java.util.*;
public class RomanToNumbers {
public static void main(String[] args) throws IOException { String inputFile = "c:/in.txt"; String outputFile = "c:/out.txt"; FileReader read = new FileReader(inputFile); BufferedReader buf = new BufferedReader(read); List<Integer> lst = new ArrayList<Integer>(); String input = buf.readLine(); do { lst.add(decodeString(input)); input = buf.readLine(); } while (input != null); buf.close(); read.close(); FileWriter fw = new FileWriter(outputFile); BufferedWriter writer = new BufferedWriter(fw); for (Integer number : lst) { writer.write(number); } writer.close(); fw.close(); }
public static int decodeString(String input) { if (input == null) { throw new NullPointerException("Input cannot be null!"); } if (input.length() == 0) { return 0; } if (input.length() == 1) { return decodeChar(input.charAt(0)); } int firstChar = decodeChar(input.charAt(0)); int secondChar = decodeChar(input.charAt(1)); int result = 0; if (secondChar > firstChar) { result = -firstChar; } else { result = firstChar; } return result + decodeString(input.substring(1)); }
private static int decodeChar(char c) { switch (c) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default: throw new IllegalArgumentException(c + " is not a roman digit"); } } }
Nej arne_v undskyld, det var med meget hjælp, primært din, der gjorde at jeg kom igennem det. Det var faktisk bare for at lukke tråden jeg besvarede, troede du havde glemt alt o denne tråd. Jeg oprette lige et ekstra spørgsmål, hvor jeg tildeler dig pointene. http://www.eksperten.dk/spm/916563
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.