Bubbelsortering med bokstäver C#

Permalänk
Medlem

Bubbelsortering med bokstäver C#

Hej! Läser programmering 1 och behöver hjälp då jag fastnat med implementring av bubbelsortering i mitt program som ska fungera som en blogg och kunna lägga in, spara, skriva ut och söka efter inlägg.
Uppgiften kräver att jag skapar en listvektor vilket jag gjort (alltså varje nytt inlägg blir en ny vektor som sparas i en lista), men får inte till det med sorteringen. Sortering ska ske via inläggets titlar. Har stirrat mig blind hela dagen och ändrat fram och tillbaka att jag inte längre vet vad jag gör.. Hoppas någon kan hjälpa mig att gå vidare med uppgiften, all hjälp uppskattas jättemycket! Tack på förhand!

List<string[]> bloggLista = new List<string[]>(); string[] blogg = new string[3];//Med plats för titel, text och datum case 5: Console.Clear(); if (bloggLista.Count > 0) { Console.WriteLine("\n\tInläggen är nu sorterade." + "\n\tSkriv ut alla inlägg via menyval [2] för att se resultat."); int length = bloggLista.Count; String nytt;//Skapar temporär variabeln som ska användas vid platsbyte for (int j = 0; j < length - 1; j++) { for (int i = j + 1; i < length; i++) { if (bloggLista[j][0].CompareTo(bloggLista[i][0]) > 0)//Jämför elementen { //Byter plats nytt = bloggLista[j];//bloggLista[j] blir rött bloggLista[j] = bloggLista[i]; bloggLista[i] = nytt;//nytt blir också rött } } } }

Permalänk
Medlem

Om första forloopen går igenom varje element och lämnar en sorterad lista efter sig så tycker jag att du istället för den inre forloopen till byter ifsatsen mot en whileloop som jämför och swappar baklänges tills det nya elementet bubblat upp till rätt plats.

Om det inte ger dig rätt ideer så bör du kolla implementationen på wikipedia eller någon bra referens på nätet och förstå den innan du gör en egen.

Permalänk
Medlem

Gjorde om din rutin till javascript då jag inte har c installerat, och jag använde inte någon CompareTo funktion, men det fungerade här.

Så det är väl kanske antingen CompareTo funktionen som är fel, eller så är det datan i din lista som är fel?

Visa signatur

I5 9600k@stock / Cooler Master Evo 212 / Gigabyte Z390 Gaming X / Corsair Vengeance LPX 16GB DDR4 3000MHz / MSI RTX2070 Gaming Z / EVGA 550 BQ / Asus VG27BQ 27" 165Hz

Ryzen 5 5600x@stock / Asus Rog Strix X570-E Gaming / Corsair Vengeance RGB Pro 16GB 3600MHz CL18 / MSI RTX3070 Suprim X / BeQuiet Pure Power 11 600W / Asus VG278Q 27" 144Hz

Permalänk
Medlem

@ivana89:

Det du behöver göra är att deklarera din "nytt" variabel som en string array istället för bara string

Visa signatur

EndeavourOS: Your search for the best Arch distro ends here
7800X3D » RX6950XT » G.SKILL 32GB » LG OLED42C35LA

Permalänk

Om det är så att programmet spottar ut ett felmeddelande är det bra om du klistrar in felmeddelandet.

Ett uppenbart fel är att nytt är deklarerad som fel datatyp.

Ett mindre uppenbart problem är att CompareTo ibland ger oväntade resultat. Om datorn är på svenska kommer å före ä, men samtidigt kommer æ före å. Om datorn är på engelska kommer ä före å, men å kommer före æ (alltså tvärtom). Åtminstone är det så i Linux. Mer logiskt hade varit att sortera ä och æ som samma bokstav om datorn är på svenska. Om det är detta som bekymrar dig tror jag att det är något du kan bortse från.

Jag använde denna kod för att kolla hur å, ä och æ sorterades:

using System; public class comparetotest { public static void Main(string[] argv) { Console.WriteLine(argv[0].CompareTo(argv[1])); } }

Permalänk
Medlem
Skrivet av immutable:

@ivana89:

Det du behöver göra är att deklarera din "nytt" variabel som en string array istället för bara string

Tack till er alla för era svar!! Jag gjorde om det lite och så klart skulle variabeln "nytt" deklareras som en vektor.
Nu funkar det fint, hoppas jag får till det nu med den binära sökningen..
Ha en trevlig påsk!!

case 5: Console.Clear(); if (bloggLista.Count > 0)//Om innehåll i listan är större än 0, alltså om listan inte är tom { for (int i = 0; i < bloggLista.Count - 1; i++) //Går igenom hela listan så många gånger som behövs //för att vara säker att listan är sorterad { for (int j = 0; j < bloggLista.Count - 1 - i; j++) //bloggLista.Count -1 -i håller reda på vilka element //som är färdigsorterade { //Jämför vektorernas första element 'titel' med CompareTo-metoden if (bloggLista[j][0].CompareTo(bloggLista[j + 1][0])> 0) { //Byter plats och sortering sker! String[] nytt = bloggLista[j];//Temporär string vektor som hjälp vid byte bloggLista[j] = bloggLista[j + 1]; bloggLista[j + 1] = nytt; } } } Console.WriteLine("\n\tInläggen är nu sorterade." + "\n\tSkriv ut alla inlägg via menyval [2] för att se resultat."); }

Permalänk
Medlem

@ivana89: Jag ser att du flyttade deklarationen av nytt in i loopen, vilket är en bra idé. Det är oftast bäst att deklarera variabler på samma ställe som de initialiseras på när det är möjligt, att deklarera variabler "i förväg" gör bara koden svårare att läsa.

En annan fördel med det är att du då kan använda var för att låta kompilatorn själv bestämma vilken typ variabeln ska ha beroende på dess värde:

var nytt = bloggLista[j]; // nytt får samma typ som bloggLista[j]

Du behöver ju själv inte veta vilken typ nytt faktiskt har i det här fallet, och genom att använda var istället för att explicit ange en typ så blir det automatiskt rätt.

Permalänk
Medlem

Tack! Nu lärde jag mig något nytt
Har inte jobbat med var i boken men har sett det förekomma i andras kod och undrat just vad det var för något.
Tack så mycket!!