[Java] läsa rader från textfilen och sen lägga det till LinkedHashMap (gjorde rätt men förstår inte...)

Trädvy Permalänk
Medlem
Registrerad
Apr 2016

[Java] läsa rader från textfilen och sen lägga det till LinkedHashMap (gjorde rätt men förstår inte...)

Hej
Först jag vill att säga ursäkta med språket. Jag är invandrare och det blir mycket konstigt med grammatik ...

Jag har ett uppgift som säger att skapa en enkel algoritm för lotteri program.
Programmet ska läsa vinster från text filen först

1 Resa för två till Azorerna 3 Weekend för två i Köpenhamn 5 Tusenkronor

Siffran som ligger framför texter betyder antal av detta typer vinster. Finns 5 Tusenkronor , 3 Weekend för två i Köpenhamn och 1 Resa för två till Azorerna.
Enligt uppgiften, måste man använda Map och lotnummerna ska plockas fram slumpmässigt.

Den är min kod som använder dessa regler

public static void main (String[]args) throws FileNotFoundException{ Map<Integer,String> tab = new LinkedHashMap<Integer,String>(); String lot , minstaNumString, störstaNumString; int minstaNum, störstaNum, antalLotteri = 0, antalVinsterTotalt = 0; while(true){ lot = JOptionPane.showInputDialog("Vilek fil ska man läsa?"); minstaNumString = JOptionPane.showInputDialog("Vad är minsta nummer i lotteri?"); minstaNum = Integer.parseInt(minstaNumString); störstaNumString = JOptionPane.showInputDialog("Vad är största nummer i lotteri?"); störstaNum = Integer.parseInt(störstaNumString); if(lot.equals("LottningVinst.txt")&&(störstaNum>minstaNum)&&(minstaNum>=0)){ break; } } antalLotteri = störstaNum-minstaNum+1; FileReader filr = new FileReader(lot); Scanner sc = new Scanner(filr); while(sc.hasNext()){ int antalVinster = sc.nextInt(); antalVinsterTotalt += antalVinster; if (antalVinsterTotalt > antalLotteri) { JOptionPane.showMessageDialog(null, "Fler vinster än antal lotter"); } else{ String vinst = sc.nextLine(); while (antalVinster>0) { int vinstNr = (int)(Math.random()*(störstaNum-minstaNum+1)) + minstaNum; if (!tab.containsKey(vinstNr)) { tab.put(vinstNr, vinst); antalVinster--; } } } } for(Map.Entry<Integer,String> m: tab.entrySet() ) System.out.println(m); }

Eftersom vinstNr är random, java ska visa olika output varje gång , och jag fick den output just nu.

1= Resa för två till Azorerna 6= Weekend för två i Köpenhamn 10= Weekend för två i Köpenhamn 7= Weekend för två i Köpenhamn 8= Tusenkronor 3= Tusenkronor 2= Tusenkronor 4= Tusenkronor 5= Tusenkronor

Den är rätt svar. Men jag förstår inte riktigt hur" java förstod att där ska vara 3 Weekend för två i Köpenhamn och 5 Tusenkronor och printar ut med exakt lika antal? "

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

Försök vara noggrann med indentation, det blir väldigt svårt att t.ex. se var en while-loop slutar när allting är på samma rad. Här är din kod med indentation fixad.

public static void main (String[]args) throws FileNotFoundException{ Map<Integer,String> tab = new LinkedHashMap<Integer,String>(); String lot , minstaNumString, störstaNumString; int minstaNum, störstaNum, antalLotteri = 0, antalVinsterTotalt = 0; while(true){ lot = JOptionPane.showInputDialog("Vilek fil ska man läsa?"); minstaNumString = JOptionPane.showInputDialog("Vad är minsta nummer i lotteri?"); minstaNum = Integer.parseInt(minstaNumString); störstaNumString = JOptionPane.showInputDialog("Vad är största nummer i lotteri?"); störstaNum = Integer.parseInt(störstaNumString); if(lot.equals("LottningVinst.txt")&&(störstaNum>minstaNum)&&(minstaNum>=0)){ break; } } antalLotteri = störstaNum-minstaNum+1; FileReader filr = new FileReader(lot); Scanner sc = new Scanner(filr); while(sc.hasNext()){ int antalVinster = sc.nextInt(); antalVinsterTotalt += antalVinster; if (antalVinsterTotalt > antalLotteri) { JOptionPane.showMessageDialog(null, "Fler vinster än antal lotter"); } else { String vinst = sc.nextLine(); while (antalVinster>0) { int vinstNr = (int)(Math.random()*(störstaNum-minstaNum+1)) + minstaNum; if (!tab.containsKey(vinstNr)) { tab.put(vinstNr, vinst); antalVinster--; } } } } for(Map.Entry<Integer,String> m: tab.entrySet() ) System.out.println(m); }

Fixad kod

Nu till varför din kod fungerar. Med loopen while(sc.hasNext()) går du igenom hela textfilen. Då är skannern i början av filen:

^1 Resa för två till Azorerna 3 Weekend för två i Köpenhamn 5 Tusenkronor

sc.nextInt() läser in nästa siffra som du sparar i antalVinster. Då är skannern här:

1 ^Resa för två till Azorerna 3 Weekend för två i Köpenhamn 5 Tusenkronor

sc.nextLine() läser sedan raden till slut, och detta sparar du som en String i vinst. Skannern är då här:

1 Resa för två till Azorerna ^3 Weekend för två i Köpenhamn 5 Tusenkronor

Så länge det finns mera text (din while-loop var while(sc.hasNext()) så fortsätter loopen.

Nu har du sparat hur många vinster det finns av en typ i antalVinster. Därefter slumpar du fram ett vinstnummer, och om det inte har vunnit redan, så lägger du till det i tab, och minskar på antalVinster med ett, tills det inte finns vinster av den typen kvar. På det viset får du rätt antal vinster.