Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008

Rövarspråk i Java

Hej! Gjorde en uppgift med rövarspråket i Java för en utbildning.

Dock var de ej nöjda utan ville att man skulle använda .contains.

Får dock inte rätt med det.

Första version som fungerar.

public static void main(String[] args) { String original = "helt"; String transformed = transformToRobberLang(original); String toOriginal = karpsravor(transformed); System.out.println("Rövarspråk: " + transformed); System.out.println("Avkodat: " + toOriginal); } public static String transformToRobberLang(String sentence) { String konsonanter1 = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string char konsonanter[] = konsonanter1.toCharArray(); //Gör om string till char array int tecken = sentence.length(); //Kollar längd på mening, inkl space char rovar[] = sentence.toCharArray(); // Gör om meningen till en char array for(int i = 0; i<tecken; i++) //Går igenom varje tecken i original sträng { for(int x = 0; x<20; x++) //Går igenom konsonant-sträng { if(rovar[i] == konsonanter[x]) //Om konsonant hittas i original sträng { String del = rovar[i]+"o"+rovar[i]; //Dubbla konsonant och lägg till o. String test = Character.toString(rovar[i]);//omvandlar char till string sentence = sentence.replaceFirst(test, del); //Ersätter extradel med konsonant } } } return sentence; } public static String karpsravor(String sentence) { String konsonanter1 = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string char konsonanter[] = konsonanter1.toCharArray(); //Gör om string till char array int tecken = sentence.length(); char rovar[] = sentence.toCharArray(); // Gör om meningen till en char array for(int i = 0; i<tecken; i++) //Går igenom varje tecken i original sträng { for(int x = 0; x<20; x++) //Går igenom konsonant-sträng { if(rovar[i] == konsonanter[x]) //Om konsonant hittas i original sträng { String del = rovar[i]+"o"+rovar[i]; //Dubbla konsonant och lägg till o. String test = Character.toString(rovar[i]);//omvandlar char till string sentence = sentence.replaceFirst(del, test); //Ersätter konsonant med extradel } } } return sentence; }

Andra version, har bara testat att omvandla till rövarspråk.

public class RobberLang2 { public static void main(String[] args) { String original = "hej"; String transformed = transformToRobberLang(original); String toOriginal = karpsravor(transformed); System.out.println("Rövarspråk: " + transformed); System.out.println("Avkodat: " + toOriginal); } public static String transformToRobberLang(String sentence) { String konsonanter1 = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string int tecken = sentence.length(); //Kollar längd på mening, inkl space for(int i = 0; i<tecken; i++) //Går igenom varje tecken i original sträng { if(!konsonanter1.contains(sentence)) { //Om konsonant hittas i original sträng String del = sentence.charAt(i) + "o" + sentence.charAt(i); //Dubbla konsonant och lägg till o. String test = Character.toString(sentence.charAt(i));//omvandlar char till string sentence = sentence.replaceFirst(del, test); //Ersätter konsonant med extradel System.out.print("Ny del " + del + "\n\n"); } } return sentence; } public static String karpsravor(String sentence) { String konsonanter1 = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string char konsonanter[] = konsonanter1.toCharArray(); //Gör om string till char array int tecken = sentence.length(); char rovar[] = sentence.toCharArray(); // Gör om meningen till en char array for(int i = 0; i<tecken; i++) //Går igenom varje tecken i original sträng { for(int x = 0; x<20; x++) //Går igenom konsonant-sträng { if(rovar[i] == konsonanter[x]) //Om konsonant hittas i original sträng { String del = rovar[i]+"o"+rovar[i]; //Dubbla konsonant och lägg till o. String test = Character.toString(rovar[i]);//omvandlar char till string sentence = sentence.replaceFirst(del, test); //Ersätter konsonant med extradel } } } return sentence; } }

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Registrerad
Jul 2017

Kan det vara så här de tänker sig att du använder .contains() för att kolla om det är en vokal?

public class JavaFiddle { public static void main(String[] args) { /* Lista på alla konsonanter */ String konsonanter = "bcdfghjklmnpqrstvwxyz"; String klartext = "hej på dig du!"; for (char c : klartext.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (konsonanter.contains(Character.toString(c))) { System.out.println(c + " är en konsonant!"); } else { System.out.println(c + " är inte en konsonant!"); } } } }

Å andra sidan, String kanske inte riktigt är rätt datatyp för konsonanter. Det finns nog andra snabbare datatyper för att snabbt kunna kolla om ett tecken är med i en viss uppsättning, typ kanske en HashSet<Character>. Kanske det uppgiften går ut på?

För bäst hjälp, försök att svara på alla frågor som ställs i ett inlägg. Då slipper vi fråga om samma sak fler gånger, och du får hjälp snabbare.

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av pv2b:

Kan det vara så här de tänker sig att du använder .contains() för att kolla om det är en vokal?

public class JavaFiddle { public static void main(String[] args) { /* Lista på alla konsonanter */ String konsonanter = "bcdfghjklmnpqrstvwxyz"; String klartext = "hej på dig du!"; for (char c : klartext.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (konsonanter.contains(Character.toString(c))) { System.out.println(c + " är en konsonant!"); } else { System.out.println(c + " är inte en konsonant!"); } } } }

Å andra sidan, String kanske inte riktigt är rätt datatyp för konsonanter. Det finns nog andra snabbare datatyper för att snabbt kunna kolla om ett tecken är med i en viss uppsättning, typ kanske en HashSet<Character>. Kanske det uppgiften går ut på?

Tack, ska kolla på det.

Är lite speciellt för uppgifterna ska spegla var de är i kursen. Så Hash är inget alternativ.

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Registrerad
Jul 2017
Skrivet av Larsp777:

Tack, ska kolla på det.

Är lite speciellt för uppgifterna ska spegla var de är i kursen. Så Hash är inget alternativ.

Tråkigt. För en HashSet<Character> hade varit mycket snabbare att slå upp om ett tecken är en vokal ( O(log(n) ) snarare än en String ( O(n) )

Fast jag vet inte, det kanske är farligt att lära sig för mycket för snabbt.

För bäst hjälp, försök att svara på alla frågor som ställs i ett inlägg. Då slipper vi fråga om samma sak fler gånger, och du får hjälp snabbare.

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av pv2b:

Tråkigt. För en HashSet<Character> hade varit mycket snabbare att slå upp om ett tecken är en vokal ( O(log(n) ) snarare än en String ( O(n) )

Fast jag vet inte, det kanske är farligt att lära sig för mycket för snabbt.

Så mitt andra problem.

Varför fungerar inte replace här?

for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (konsonanter.contains(Character.toString(c))) { String del = sentence.charAt(i) + "o" + sentence.charAt(i); //Dubbla konsonant och lägg till o. //String test = Character.toString(sentence.charAt(i));//omvandlar char till string sentence = sentence.replaceFirst(del, sentence); //Ersätter konsonant med extradel System.out.print("Ny del " + sentence + "\n\n"); System.out.println(c + " är en konsonant!"); } else { System.out.println(c + " är inte en konsonant!"); } i++; }

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Registrerad
Jul 2017
Skrivet av Larsp777:

Så mitt andra problem.

Varför fungerar inte replace här?

for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (konsonanter.contains(Character.toString(c))) { String del = sentence.charAt(i) + "o" + sentence.charAt(i); //Dubbla konsonant och lägg till o. //String test = Character.toString(sentence.charAt(i));//omvandlar char till string sentence = sentence.replaceFirst(del, sentence); //Ersätter konsonant med extradel System.out.print("Ny del " + sentence + "\n\n"); System.out.println(c + " är en konsonant!"); } else { System.out.println(c + " är inte en konsonant!"); } i++; }

Om din klartext är "hallå" så kommer den:

1. Byta ut första h. ("hohallå")
2. Inte byta ut a.
3. Byta ut första l. ("hohalollå")
4. Byta ut första l. ("hohalolollå")
5. Inte byta ut å.

Ser du problemet? Byt inte ut "första" tecknet.

Enklast är bara att bygga en ny sträng tecken för tecken.

För bäst hjälp, försök att svara på alla frågor som ställs i ett inlägg. Då slipper vi fråga om samma sak fler gånger, och du får hjälp snabbare.

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av pv2b:

Om din klartext är "hallå" så kommer den:

1. Byta ut första h. ("hohallå")
2. Inte byta ut a.
3. Byta ut första l. ("hohalollå")
4. Byta ut första l. ("hohalolollå")
5. Inte byta ut å.

Ser du problemet? Byt inte ut "första" tecknet.

Enklast är bara att bygga en ny sträng tecken för tecken.

Tack igen! Ska kolla på det. Lite stressad nu.

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av pv2b:

Om din klartext är "hallå" så kommer den:

1. Byta ut första h. ("hohallå")
2. Inte byta ut a.
3. Byta ut första l. ("hohalollå")
4. Byta ut första l. ("hohalolollå")
5. Inte byta ut å.

Ser du problemet? Byt inte ut "första" tecknet.

Enklast är bara att bygga en ny sträng tecken för tecken.

Jo, förstår väl principen och jag gjorde i första försöket (som fungerade) fast inte så snyggt.

Tanken är ju att om det är en konsonant ska man gå in i if-satsen och göra bytet annars inte.

for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (konsonanter.contains(Character.toString(c))) { String del = sentence.charAt(i) + "o" + sentence.charAt(i); //Dubbla konsonant och lägg till o. String test = Character.toString(sentence.charAt(i));//omvandlar char till string sentence = sentence.replaceAll(test, del); //Ersätter konsonant med extradel System.out.print("Ny del " + del + "\n\n"); System.out.println(c + " är en konsonant!"); } else { System.out.println(c + " är inte en konsonant!"); } i++; }

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Registrerad
Jul 2017

Strunta i att försöka "byta" ut. Gå tecken för tecken i klartexten och bygg kryptotexten element för element. Det blir mycket enklare, jag lovar.

För bäst hjälp, försök att svara på alla frågor som ställs i ett inlägg. Då slipper vi fråga om samma sak fler gånger, och du får hjälp snabbare.

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av pv2b:

Strunta i att försöka "byta" ut. Gå tecken för tecken i klartexten och bygg kryptotexten element för element. Det blir mycket enklare, jag lovar.

Ok, försökte följa ditt råd genom att använda stringbuilder.

Inte riktig rätt än:

public static String transformToRobberLang(String sentence) { String consonants = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string int i = 0; char letter; StringBuilder sb = new StringBuilder(sentence); for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (consonants.contains(Character.toString(c))) { letter = sentence.charAt(i); sb.insert(i, letter); sb.insert(i, 'o'); sb.insert(i, letter); System.out.println(sb.toString()); } else { System.out.println(c + " är inte en konsonant!"); } i++; } return sb.toString(); }

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av pv2b:

Strunta i att försöka "byta" ut. Gå tecken för tecken i klartexten och bygg kryptotexten element för element. Det blir mycket enklare, jag lovar.

Detta! @Larsp777, rör inte sentence, vad du gör. Jag kan hjälpa dig på rätt spår genom att lägga till två nyckelord i din kod:

public static String transformToRobberLang(final String sentence) public static String karpsravor(final String sentence)

Istället för att se sentence som något slags state som du ska mutera (generellt alltid riskfyllt), se det som en input, baserat på vilken du ska generera en output.

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av Alling:

Detta! @Larsp777, rör inte sentence, vad du gör. Jag kan hjälpa dig på rätt spår genom att lägga till två nyckelord i din kod:

public static String transformToRobberLang(final String sentence) public static String karpsravor(final String sentence)

Istället för att se sentence som något slags state som du ska mutera (generellt alltid riskfyllt), se det som en input, baserat på vilken du ska generera en output.

Ok, nu så här.

public static String transformToRobberLang(final String sentence) { String consonants = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string String tempSentence = sentence; int i = 0; char letter; StringBuilder sb = new StringBuilder(tempSentence); for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (consonants.contains(Character.toString(c))) { letter = sentence.charAt(i); sb.insert(i, letter); sb.insert(i, 'o'); sb.insert(i, letter); System.out.println(sb.toString()); } else { System.out.println(c + " är inte en konsonant!"); } i++; } return sb.toString(); }

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

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

@Larsp777: Du lägger inte till vokaler i strängen som du bygger upp, du skriver bara ut att de inte är konsonanter. Eller är det något annat du tänker på när du säger att koden inte fungerar?

Och varför använder du letter = sentence.charAt(i); för att hämta karaktären? Du itererar ju redan över strängen, så du kan lika gärna bara använda c direkt istället.

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av perost:

@Larsp777: Du lägger inte till vokaler i strängen som du bygger upp, du skriver bara ut att de inte är konsonanter. Eller är det något annat du tänker på när du säger att koden inte fungerar?

Och varför använder du letter = sentence.charAt(i); för att hämta karaktären? Du itererar ju redan över strängen, så du kan lika gärna bara använda c direkt istället.

Brukar programmera i C# så har väl inte full koll.

Men, jo, det är just det att jag inte får ihop slutsträngen.

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av Larsp777:

Brukar programmera i C# så har väl inte full koll.

Men, jo, det är just det att jag inte får ihop slutsträngen.

Hm, fast när man skriver

StringBuilder sb = new StringBuilder(tempSentence);

Är det inte strängen tempSentence jag bygger vidare på då?

public static String transformToRobberLang(final String sentence) { String consonants = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string String tempSentence = sentence; int i = 0; char letter; StringBuilder sb = new StringBuilder(tempSentence); for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (consonants.contains(Character.toString(c))) { sb.insert(i, c); sb.insert(i, 'o'); sb.insert(i, c); } i++; } return sb.toString(); }

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av Larsp777:

Hm, fast när man skriver

StringBuilder sb = new StringBuilder(tempSentence);

Är det inte strängen tempSentence jag bygger vidare på då?

public static String transformToRobberLang(final String sentence) { String consonants = "bcdfghjklmnpqrstvwxz"; //Sparar alla konsonanter i en string String tempSentence = sentence; int i = 0; char letter; StringBuilder sb = new StringBuilder(tempSentence); for (char c : sentence.toCharArray()) { /* För varje tecken i klartexten, finns tecknet med i listan på konsonanter? */ if (consonants.contains(Character.toString(c))) { sb.insert(i, c); sb.insert(i, 'o'); sb.insert(i, c); } i++; } return sb.toString(); }

Tacksam om någon kan visa hur man gör på rätt sätt.

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av Larsp777:

Hm, fast när man skriver

StringBuilder sb = new StringBuilder(tempSentence);

Är det inte strängen tempSentence jag bygger vidare på då?

Det är oklart varför du alls skapar variabeln tempSentence.

För att kunna svara på din fråga måste jag först belysa skillnaden mellan variabeln tempSentence och det objekt (av typen String) som den refererar till. En skylt som pekar ut var Göteborg ligger är inte samma sak som staden Göteborg.

Ett uttryck i stil med new StringBuilder(x) betyder ”en ny StringBuilder vars initiala innehåll är den sträng som representeras av den String som x pekar på just då”. (Sannerligen imperativ programmering i ett nötskal!) En sådan StringBuilder kommer aldrig bidra till att varken variabeln x eller den String som x pekar på ändras på något sätt.

Ett String-objekt kan för övrigt aldrig ändras i Java, ty instanser av String är icke-muterbara. Däremot kan en variabel som pekar på ett sådant objekt fås att peka på ett annat String-objekt istället. Testa gärna följande kod:

String a = "Alice"; String b = a; a = "Bob"; System.out.println(b);

Skrivet av Larsp777:

Tacksam om någon kan visa hur man gör på rätt sätt.

Jag tror att ditt liv blir betydligt enklare om du använder append istället för insert på din StringBuilder.

Skrivet av Oracle:

The principal operations on a StringBuilder are the append and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string builder. The append method always adds these characters at the end of the builder; the insert method adds the characters at a specified point.

https://docs.oracle.com/javase/8/docs/api/index.html?java/lan...

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av Alling:

Det är oklart varför du alls skapar variabeln tempSentence.

För att kunna svara på din fråga måste jag först belysa skillnaden mellan variabeln tempSentence och det objekt (av typen String) som den refererar till. En skylt som pekar ut var Göteborg ligger är inte samma sak som staden Göteborg.

Ett uttryck i stil med new StringBuilder(x) betyder ”en ny StringBuilder vars initiala innehåll är den sträng som representeras av den String som x pekar på just då”. (Sannerligen imperativ programmering i ett nötskal!) En sådan StringBuilder kommer aldrig bidra till att varken variabeln x eller den String som x pekar på ändras på något sätt.

Ett String-objekt kan för övrigt aldrig ändras i Java, ty instanser av String är icke-muterbara. Däremot kan en variabel som pekar på ett sådant objekt fås att peka på ett annat String-objekt istället. Testa gärna följande kod:

String a = "Alice"; String b = a; a = "Bob"; System.out.println(b);

Tanken var att jag skulle skapa en ny variabel genom att skapa en kopia av den sträng jag skickar in.

Så hur är rätt sätt då?

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Plats
Hässleholm
Registrerad
Jan 2008
Skrivet av Alling:

Det är oklart varför du alls skapar variabeln tempSentence.

För att kunna svara på din fråga måste jag först belysa skillnaden mellan variabeln tempSentence och det objekt (av typen String) som den refererar till. En skylt som pekar ut var Göteborg ligger är inte samma sak som staden Göteborg.

Ett uttryck i stil med new StringBuilder(x) betyder ”en ny StringBuilder vars initiala innehåll är den sträng som representeras av den String som x pekar på just då”. (Sannerligen imperativ programmering i ett nötskal!) En sådan StringBuilder kommer aldrig bidra till att varken variabeln x eller den String som x pekar på ändras på något sätt.

Ett String-objekt kan för övrigt aldrig ändras i Java, ty instanser av String är icke-muterbara. Däremot kan en variabel som pekar på ett sådant objekt fås att peka på ett annat String-objekt istället. Testa gärna följande kod:

String a = "Alice"; String b = a; a = "Bob"; System.out.println(b);

Jag tror att ditt liv blir betydligt enklare om du använder append istället för insert på din StringBuilder.

Ok, funderade på det också men tyckte att insert verkade lämpligare.

Tack för tipsen, ska kämpa vidare.

Chassi: Fractal Design Define C || Processor: Intel i7-8700K || Grafikkort: ASUS GeForce GTX 1080Ti ROG Strix Gaming || Moderkort: Gigabyte Z370 AORUS ULTRA WIFI || Minne: Corsair Vengeance LPX DDR4 3000MHz 32 Gb || Lagring: Samsung 860 EVO 1TB SSD || PSU: Seasonic Focus+ 850W 85+ GOLD PSU || Acer Predator XB271HU || Windows 10

Trädvy Permalänk
Medlem
Registrerad
Jul 2017

Sätt dig ner med penna och papper. Skriv ut ett par ord "klartext".

Skriv sedan på nästa rad den "rövarspråkifierade" versionen av denna.

Tänk sedan efter hur du skulle bära dig åt för att få datorn att göra samma sak. Då tror jag det lossnar för dig.

För bäst hjälp, försök att svara på alla frågor som ställs i ett inlägg. Då slipper vi fråga om samma sak fler gånger, och du får hjälp snabbare.