Permalänk

Jämföra nummer med string

Hej! Har en uppgift där man ska skriva ett program som förvandlar nummer från 1-12 till den motsvarande månaden, och jag har fastnat på substringen, som jag ska använda för att hitta vilken månad som tillhör numret som skrevs in. I uppgiften stod det också att vi skulle använda en lång string med alla månaderna i.

Såhär långt har jag kommit: https://gyazo.com/20d5cceb53396de7fd930c8ded61b132

Hur ska jag fortsätta?

Permalänk
Avstängd
Skrivet av hawthorns:

Hej! Har en uppgift där man ska skriva ett program som förvandlar nummer från 1-12 till den motsvarande månaden, och jag har fastnat på substringen, som jag ska använda för att hitta vilken månad som tillhör numret som skrevs in. I uppgiften stod det också att vi skulle använda en lång string med alla månaderna i.

Såhär långt har jag kommit: https://gyazo.com/20d5cceb53396de7fd930c8ded61b132

Hur ska jag fortsätta?

Eh, om du måste använda en lång string kan du dela den vid varje ' ' och sedan ta biten som är numret du ska förvandla.

Visa signatur

NUC med Hackintosh • ThinkPad Bärbar

Permalänk
Medlem

Finns det inget sätt som du kan dela strängen men månader på?

Skickades från m.sweclockers.com

Permalänk

Jag har letat runt ett tag, och har hittat en lösning om jag bara pastar in den, men det hade fortfarande inte gjort så att jag lärt mig något. Det är två stycken rader som jag inte förstår, och som löser problemet..

int leftBorder = (numberOfMonth - 1) * charactersInMostLongMonth;
int rightBorder = (numberOfMonth - 1) * charactersInMostLongMonth + 9;
String yourMonth = months.substring(leftBorder, rightBorder);

Sista raden sätter ihop left+right, men varför blir numberOfMonth -1 samt * charactersInMostLongMonth; och likadant fast med plus nio nedanför?

Permalänk
Medlem

Sista raden:

System.Out.println("Månaden är: " + months.Split(" ")[numberOfMonth - 1])

Edit: Split-funktionen tar din sträng (i detta fall den med alla månader) och delar upp den på tecknet som man anger som argument. Då strängen separerar månaderna på mellanslag så kommer en split med " " att resultera i en string-array med alla månader som innehåll. Därefter kan man hämta varje månad med dess index i arrayen (obs att index börjar på noll, därav månaden minus ett).

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
Medlem

Låter som du ska använda split och inte substring.

var monthName = months.Split(' ', StringSplitOptions.RemoveEmptyEntries)[numberOfMonth - 1]

Kan även vara bra att kontrollera att numberOfMonth är mellan 1 och 12 annars kommer applikationen att krascha om du anger t.ex. 0 eller 13.

Kan alltid vara bra att kolla MSDN

Edit: Noterade nu att det var Java, men bör vara ungefär samma sak där...

Permalänk
Medlem
Skrivet av mmolder:

Sista raden:

System.Out.println("Månaden är: " + months.Split(" ")[numberOfMonth - 1])

Edit: Split-funktionen tar din sträng (i detta fall den med alla månader) och delar upp den på tecknet som man anger som argument. Då strängen separerar månaderna på mellanslag så kommer en split med " " att resultera i en strin-array med alla månader som innehåll. Därefter kan man hämta varje månad med dess index i arrayen (obs att index börjar på noll, därav månaden minus ett).

Nästa gång kan du väl tänka på att det är en skoluppgift, ge inte svaret rakt upp och ned. Peka bara i rätt riktning istället annars gör du honom en björntjänst.

OP: du har två felstavningar du kan rätta till!

Permalänk

Detta är andra kapitlet i boken. Exempelvis arraylists, loopar och splits har vi inte ens nuddat vid än. Vi ska använda substrings, därav koden jag postade.

Permalänk
Medlem

Den koden bör väl inte funka?
Exempelvis J i juni har index 33 (34:e tecknet), men leftBorder=(6-1)*9 (September har 9 bokstäver)

Visa signatur

Lilla: DAN Cases A4 v2 | GTX1060 6GB FE | MSI Z370I | i5 8600k | Noctua NH-L9i | Corsair SF600 | Corsair CL15 Vengeance LPX 2x8GB |
Stora: CM HAF XB EVO | GTX1070 ASUS ROG STRIX DC3 | ASUS P8Z68 | i7 2700k | CM Hyper 212 Plus | Corsair TX750 | 4x4GB

Permalänk
Medlem

@hawthorns: Finns det någon begränsning på hur strängen med månader måste se ut? Annars är det enklast att bara lägga till extra mellanslag så att varje månad får 9 tecken, d.v.s. istället för t.ex. (med _ istället för mellanslag för tydlighet) "May_June" så blir det "May______June". Då fungerar det att göra som du skrev, d.v.s. att multiplicera månadens nummer med antalet bokstäver i den längsta månaden.

Permalänk
Medlem

Om du inte får använda split så kan du kanske traversera strängen och räkna mellanslag.

Permalänk
Medlem

Gör tabeller med start och slut för varje månad i strängen. Hårdkoda. Eller gör en funktion som vandrar igenom och fyller i alla slut/start.

Då kan du enkelt hitta och skriva en sträng för varje månad.

För månad m skriver du sedan ut months[start[m]] till months[slut[m]]

Alltså en substring som börjar på months[start[m]] och slutar på months[slut[m]]

Visa signatur

Linux och Android

Permalänk
Medlem

Om du får ändra strängen med månader i din uppgift kan du bara sätta värdet före månaden. T.ex
1januari2februari3mars
Osv
Kör sedan substring från vald nummer till vald nummer +1.

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av hawthorns:

Jag har letat runt ett tag, och har hittat en lösning om jag bara pastar in den, men det hade fortfarande inte gjort så att jag lärt mig något. Det är två stycken rader som jag inte förstår, och som löser problemet..

int leftBorder = (numberOfMonth - 1) * charactersInMostLongMonth;
int rightBorder = (numberOfMonth - 1) * charactersInMostLongMonth + 9;
String yourMonth = months.substring(leftBorder, rightBorder);

Sista raden sätter ihop left+right, men varför blir numberOfMonth -1 samt * charactersInMostLongMonth; och likadant fast med plus nio nedanför?

@perost har förklaringen. Månadernas namn är "paddade" så att de börjar på fasta positioner med samma avstånd hela tiden.

Då behöver du bara multiplicera månadens nummer med det fasta avståndet för att hitta startpositionen för den månaden.

n-1 används för att du tror att januari är månad nummer 1. Men datorn och ditt program anser att det är månad nummer 0. Det krävs för att matematiken skall funka.

+9 är tokigt. Det borde varit charactersInMostLongMonth, men det är kanske 9.

Visa signatur

Linux och Android

Permalänk
Medlem

Splitta strängen vid mellanslag och lagra i en array.. sen tar du användarens input -1 som index i arrayen.

Visa signatur

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | KFA2 GTX 1080 Ti