Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

reversera text-fil, Java

Jag har en textfil med några rader text som jag vill reversera med stringbuilder men jag får det inte att funka som jag vill.

Om filen ser ut så här:

1 abcd
2 ABCD
3 efgh

så vill jag att den ska bli reverserad till:

dcba 1
DCAB 2
hgfe 3

Men när jag använder koden så kommer raderna i fel ordning
.... 3
.... 2
.... 1

File reverseFile = new File(fileName); Scanner scan = new Scanner(reverseFile); StringBuilder sb = new StringBuilder(); while(scan.hasNextLine()){ sb.append(scan.nextLine()).reverse(); sb.append("\n"); } scan.close(); PrintWriter printWriter = new PrintWriter("testReverse.txt"); printWriter.print(sb); printWriter.close();

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2010

@burton666:

Testa att ändra
sb.append(scan.nextLine()).reverse();
till:
sb.append(scan.nextLine().reverse());

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Funkar tyvärr inte då scan.nextLine är en String och inte ett stringbuilder object

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

@burton666:

sb.append(scan.nextLine()).reverse();

Här kör du reverse på din StringBuilder varje iteration i loopen, vilket inte var det du tänkt
Här ser du vad som händer med texten "test = {i}" där {i} motsvarar iterationen i loopen.

Iteration : 1 Stringbuilder: 0 = tset Iteration : 2 Stringbuilder: 1 = tset test = 0 Iteration : 3 Stringbuilder: 2 = tset 0 = tset test = 1 Resultat: 2 = tset 0 = tset test = 1

Exempelvis kan du skriva en egen metod som returnerar inmatad sträng baklänges eller testa vad Nissan8 skriver

sb.append(reverseString(scan.nextLine());

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2010

@burton666:

I see. Men det är iallafall raden du vill reversa, inte hela alltet.
Har ingen Java-IDE installerad så har inte möjlighet att testa själv, men detta då?

while(scan.hasNextLine()){
sb.append(new StringBuilder(scan.nextLine()).reverse()); // eventuellt toString-a efter reverse
sb.append("\n");
}

Trädvy Permalänk
Medlem
Plats
#Archlinux
Registrerad
Jun 2007

@burton666:

Makar ingen sense att det skall fungera;
Du skapar ett stringbuilder objekt, sedan lägger du på text och kör reverse som i sin tur gör reverse på allt i stringbuilder objektet. Detta sker då varje iteration.

Antingen skapar du en egen metod som kör reverse på strings som kör reverse innan du tar in varje rad till stringbuilder, eller tömmer den varje iteration och tilldelar den nya texten till någon lista/temp. eller så fulkodar du och skapar ett ny stringbuilder för varje iteration och tilldelar just den texten du vill reversa och skriver till en fil.

Göra det snyggt så läs in för varje rad, reversa per rad med en egen metod och sedan skriv till fil. Tråda inläsning/reverse om du är ricer.

Arch - Makepkg, not war -||- Asus Crosshair Hero VI -||- GSkill 16GiB DDR4 15-15-15-35-1T 3600Mhz -||- AMD 1600x @ 4.1GHz -||- nVidia MSI 970 Gaming -||- Samsung 850 Pro -||- EVEGA G2 750W -||- Corsair 570x -||- Asus Xonar Essence STX -||- Sennheiser HD-650 -||
Arch Linux, one hell of a distribution.