Java: Hur kan jag omvandla varannan bokstav till stor bokstav

Permalänk

Java: Hur kan jag omvandla varannan bokstav till stor bokstav

Har fått en uppgift av min lärare där vi ska börja med

String alphabet = abcdefghijklmnopqrstuvwxyzåäö

och sedan omvandla varannan bokstav till upper case. Vi har fått ett tips om att vi ska använda oss av

alphabet.toUpperCase();

Hur ska jag fixa det?

Edit: Min lärare har specifikt sagt att vi får använda internet

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem

En for-loop där du jämför indexen med modulus av 2 kanske?

Visa signatur

Core i7 7700K | Titan X (Pascal) | MSI 270I Gaming Pro Carbon | 32 GiB Corsair Vengeance LPX @3000MHz | Samsung 960 EVO 1TB

Permalänk
99:e percentilen

Fundera på vad toUpperCase är för något. Experimentera gärna med den i en REPL.

Fundera även på hur din lösning borde se ut på en övergripande nivå. Finns det möjlighet att skriva en generell lösning som fungerar för alla strängar? Visst vore det trevligt med en funktion som tar en sträng som argument och alltid spottar ut en sträng med samma innehåll fast där varannan bokstav är versal. Man skulle kunna tänka sig att den har typsignaturen

public static String everyOtherToUpper(String s)

och fungerar så här:

> everyOtherToUpper("") "" > everyOtherToUpper("sweclockers") "sWeClOcKeRs" > everyOtherToUpper("HEJ") "HEJ"

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

String alphabet = "abcdefghijklmnopqrstuvwxyzåäö"; System.out.println(alphabet); for (int i = 0; i < 29; i = i + 2) { char result = alphabet.charAt(i); alphabet.toUpperCase(result);

Det har jag nu gjort. Men "alphabet.toUpperCase(result);" ger error koden "char can not be converted to locale". Vad ska jag nu göra?

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem

Metoden tar inget argument utan konverterar hela strängen till stora bokstäver.
Jag tror att lättaste sättet är att göra om strängen till en char array och använda Character.toUpperCase.

Visa signatur

flippy @ Quakenet

Permalänk
Permalänk
Avstängd
Skrivet av MariusFranzen:

Min lärare har specifikt sagt att vi får använda internet

Jo, men kanske mer för att leta definitioner och generella exempel? Annars är det väl en dålig lärare, bättre i sådant fall att läraren delar ut ett papper med lösningen som ni får tjuvkika på när ni kör fast och sedan blir det en genomgång när inlämningen/uppgiften är klar.

Förstår mig inte på varför man överhuvudtaget skulle VILJA få en lösning serverad på silverfat... man får väl försöka lära sig problemlösning först, sedan är ju semantiken/syntaxen bara ett formalia (som man lätt kan hitta förklarat i läroböcker eller på nätfora).

Permalänk

@videopac: Saken är att vi ska kunna förklara noggrant vad koden gör, så om man bara copy pastar och inte bryr sig nå mer så är det inte godkänt.

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem

Tycker att du fått tillräckligt mkt med information för att kunna lösa detta.
Du behöver en loop
Du behöver ToUpper() (https://msdn.microsoft.com/en-us/library/system.string.touppe...).aspx)

sen behöver du i loopen skapa en ny sträng där du plockar ut bokstäverna en och en, och varanann gång kör du toUpper och varannan gång inte och returnera detta.

Visa signatur

Fractal Design Node 304 -> ASUS ROG STRIX Z370-I GAMING ->i5 8600K -> be quiet! Pure Rock -> MSI GeForce RTX 4070 VENTUS 2X E 12G OC -> Corsair Vengeance LPX 3200 32GB -> Seasonic FOCUS Plus 650W Gold -> Samsung 960 EVO 500GB -> 2 * Western Digital Black 2 TB -> Samsung 850 EVO Basic SSD 500GB

Permalänk

@Verdurakh: Ja, jag har löst det nu

public static void main(String[] args) { String alphabet = "abcdefghijklmnopqrstuvwxyzåäö"; System.out.println(alphabet); StringBuilder sb = new StringBuilder(); for (int i = 0; i < alphabet.length(); i++) { char c = alphabet.charAt(i); sb.append(i % 2 == 0 ? Character.toUpperCase(c) : c); } String result = sb.toString(); System.out.println(result); }

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem

Tycker det ser snyggare ut att lösa det utan modulo så slipper man det villkoret i loopen.

public static String convert(String s) { char[] c = s.toCharArray(); for (int i = 0; i < c.length; i += 2) c[i] = Character.toUpperCase(c[i]); return new String(c); }

Visa signatur

flippy @ Quakenet

Permalänk
Medlem
Skrivet av MariusFranzen:

@Verdurakh: Ja, jag har löst det nu

public static void main(String[] args) { String alphabet = "abcdefghijklmnopqrstuvwxyzåäö"; System.out.println(alphabet); StringBuilder sb = new StringBuilder(); for (int i = 0; i < alphabet.length(); i++) { char c = alphabet.charAt(i); sb.append(i % 2 == 0 ? Character.toUpperCase(c) : c); } String result = sb.toString(); System.out.println(result); }

Du har löst det, men förstår du vad du har gjort?

Försök skriv en kommentar på varje rad om vad som händer.

Permalänk

@Baxtex: Jag har inte riktigt förstått vad string builder är, så det ska jag kolla upp på måndag, men annar så kan jag

public static void main(String[] args) { //Skapar en string som har alfabetet som värde String alphabet = "abcdefghijklmnopqrstuvwxyzåäö"; //Skriver ut det System.out.println(alphabet); //Gör en ny StringBuilder (?) StringBuilder sb = new StringBuilder(); //for loop som kör loopen så många gånger som det finns bokstäver i alfabetet for (int i = 0; i < alphabet.length(); i++) { //Skapar en char som väljer varannan bokstav varje loop char c = alphabet.charAt(i); //Vet inte vad sb.append gör men det inom parentesen är if/else sb.append(i % 2 == 0 ? Character.toUpperCase(c) : c); } String result = sb.toString(); //Skriver ut det nya alfabetet System.out.println(result); }

Visa signatur

We all got a chicken-duck-woman-thing waiting for us

CPU: Intel Core i7 10700K
GPU: Nvidia GTX 1080
RAM: DDR4 16 GB

Permalänk
Medlem

Från Java dokumenationen så är StringBuilder "A mutable sequence of characters, vilket gör att man kan ändra strängen till skillnad från strängen i en String.

Visa signatur

flippy @ Quakenet

Permalänk
Medlem

#include <stdio.h> #include <stdint.h> #define TRUE (uint8_t)0x01 #define FALSE (uint8_t)0x00 void ToUpperCase(int8_t *str) { uint8_t index = 0; while (*str != '\0') { if ((index % 0x02) == 0x00) { uint8_t lowerCase = (('a' <= *str) && (*str <= 'z')) ? TRUE : FALSE; if (TRUE == lowerCase) { *str -= 0x20; } } index++; str++; } } int main(void) { int8_t str[] = "abcdefghijklmnopqrstuvwxyz"; printf("Input:\t%s\n", str); ToUpperCase(str); printf("Output:\t%s\n", str); return 0; }

Input: abcdefghijklmnopqrstuvwxyz Output: AbCdEfGhIjKlMnOpQrStUvWxYz

Inte java dock

Permalänk
Medlem
Skrivet av MariusFranzen:

@Baxtex: Jag har inte riktigt förstått vad string builder är, så det ska jag kolla upp på måndag, men annar så kan jag

public static void main(String[] args) { //Skapar en string som har alfabetet som värde String alphabet = "abcdefghijklmnopqrstuvwxyzåäö"; //Skriver ut det System.out.println(alphabet); //Gör en ny StringBuilder (?) StringBuilder sb = new StringBuilder(); //for loop som kör loopen så många gånger som det finns bokstäver i alfabetet for (int i = 0; i < alphabet.length(); i++) { //Skapar en char som väljer varannan bokstav varje loop char c = alphabet.charAt(i); //Vet inte vad sb.append gör men det inom parentesen är if/else sb.append(i % 2 == 0 ? Character.toUpperCase(c) : c); } String result = sb.toString(); //Skriver ut det nya alfabetet System.out.println(result); }

En String i Java är lite av ett special objekt kan man säga.

En sträng i de flesta språk är bara en sekvens av bokstäver (char).
Dvs
[ 'h', 'e', 'j' ]
är samma som
"hej"

En arrays storlek är alltid fixerad och kan inte ändras, så om du slår ihop två strängar t ex så skapas det internt ett nytt array för att hålla resultatet. Dvs en sträng kan man inte ändra utan de görs bara om.

Detta är en ganska kostsam process, om du ska sätta ihop många strängar så blir det mycket skapande och förstörande av arrayer vilket kan bli tungt.

Därför finns klassen StringBuilder. Klassens syfte är att göra sträng ihopssättningen lite bättre och lättare. Jag har inte kollat på källkoden, men jag kan tänka mig att klassen har någon list struktur för att bygga strängar med.

Permalänk
Medlem

@MariusFranzen: "Vet inte vad sb.append gör men det inom parentesen är if/else"

Vad betyder append?

Hur skulle du skriva raden

sb.append(i % 2 == 0 ? Character.toUpperCase(c) : c);

om du var tvungen att skriva den på formen

if ( ... ) { ... } else { ... }

?

Visa signatur

CPU: Ryzen 5 1600 GPU: Asus GeForce GTX 1060 6GB DUAL Moderkort: MSI B350M Mortar
RAM: 16GB Corsair Vengeance DDR4 3200MHz PSU: Corsair RM750X
Laptop: ThinkPad T480s, Core i7 8550U, 16GB RAM Mobil: Samsung Galaxy S10

Permalänk
Medlem

@Lasse Laserman:

Append betyder att lägga till, så i dit fall så lägger du till bokstaven c till sb som stor eller liten bokstav bereonde på värdet av i. Om i är jämnt delbart med två så lägger du till den stora bokstaven till sb annars lilla bokstaven...

Citat:

Append: add (something) as an attachment or supplement.
"the results of the survey are appended to this chapter"
synonymer: add, attach, affix, tack on, tag on, subjoin

'?' är en operator.

If (3 == x) y = 1; else y = 0;

Går att skriva som följande:

y = (3 == x) ? 1 : 0;

Om uttrycket innan '?' är sant så blir y tilldelat 1 om det är falskt blir y tilldelat 0.
Så till din fråga:

sb.append(i % 2 == 0 ? Character.toUpperCase(c) : c);

Går motsvarar alltså följande:

if ((i % 2) == 0) sb.append(Character.toUpperCase(c)); else sb.append(c);

Anledningen till varför man kan vilja skriva det med hjälp av '?' operatorn är att operatorn kräver att man tar hänsyn till både true och false fallet. Kan förstå att det ser lite kryptiskt ut ifall man aldrig har stött på operatorn innan.

Permalänk
Medlem

@Petrikus: Ja, det är korrekt, men nu var det var det ju inte du som skulle svara på frågorna. (Skulle kanske förtydligat att de var ämnade för Thunderstruc.)

Visa signatur

CPU: Ryzen 5 1600 GPU: Asus GeForce GTX 1060 6GB DUAL Moderkort: MSI B350M Mortar
RAM: 16GB Corsair Vengeance DDR4 3200MHz PSU: Corsair RM750X
Laptop: ThinkPad T480s, Core i7 8550U, 16GB RAM Mobil: Samsung Galaxy S10

Permalänk
Medlem

@Lasse Laserman: Haha oj, läste inte riktigt vem som ställde frågan, svarade bara. Aja hoppas någon lär sig utav det.

Permalänk
Medlem
Skrivet av Petrikus:

#include <stdio.h> #include <stdint.h> #define TRUE (uint8_t)0x01 #define FALSE (uint8_t)0x00 void ToUpperCase(int8_t *str) { uint8_t index = 0; while (*str != '\0') { if ((index % 0x02) == 0x00) { uint8_t lowerCase = (('a' <= *str) && (*str <= 'z')) ? TRUE : FALSE; if (TRUE == lowerCase) { *str -= 0x20; } } index++; str++; } } int main(void) { int8_t str[] = "abcdefghijklmnopqrstuvwxyz"; printf("Input:\t%s\n", str); ToUpperCase(str); printf("Output:\t%s\n", str); return 0; }

Input: abcdefghijklmnopqrstuvwxyz Output: AbCdEfGhIjKlMnOpQrStUvWxYz

Inte java dock

Använd char istället för int8_t om du ska hantera tecken och använd C's inbygga toupper.

void convert(char* s) { while (*s != 0 || *(s + 1) != 0) { *s = toupper(*s); s += 2; } }

Visa signatur

flippy @ Quakenet

Permalänk
Medlem

Här är en oneliner i perl
preg_replace('/(\w)(.)?/e', "strtoupper('$1').strtolower('$2')", 'test example');