Forumdelen sponsras av

Trädvy Permalänk
Medlem
Registrerad
Jul 2018

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?

Trädvy Permalänk
Medlem
Registrerad
Sep 2017
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.

Trädvy Permalänk
Medlem
Registrerad
Nov 2004

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

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Jul 2018

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?

Trädvy Permalänk
Medlem
Registrerad
Jul 2015

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).

Skoj: i5 8600k, Z370-P ATX, 1070 ROG Strix 8 GB, 16 GB DDR4 @3200MHz, Kraken X62
Jobb: Dell XPS 13 9370 4K
Privat: Macbook Pro 13" late 2016

Trädvy Permalänk
Medlem
Plats
Bangkok
Registrerad
Feb 2009

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...

Trädvy Permalänk
Medlem
Plats
Norrköping
Registrerad
Jan 2011
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!

Trädvy Permalänk
Medlem
Registrerad
Jul 2018

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.

Trädvy Permalänk
Medlem
Registrerad
Jul 2018

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)

Lilla: DAN Cases A4 v2 | Geforce GTX1070 (ASUS ROG STRIX DC3) | MSI Z370I | i5 8600k | Noctua NH-L9i | Corsair SF600 | Corsair CL15 Vengeance LPX 2x8GB |
Stora:
Bärbara: Microsoft Surface Pro 4

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@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.

Trädvy Permalänk
Medlem
Registrerad
Nov 2004

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

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

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]]

Linux och Android

Trädvy Permalänk
Medlem
Plats
Halland
Registrerad
Okt 2013

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

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018
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.

Linux och Android

Trädvy Permalänk
Medlem
Registrerad
Okt 2007

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

Ryzen 1700 @3,8Ghz 1,342V | Corsair Vengeance LPX 2x8Gb (CMK16GX4M2B3000C15) | Asus Prime x370 Pro | MSI GTX 770 2GB SLI