• 1
  • 2
2022-05-22, 18:10
  #1
Medlem
jonatan36s avatar
Hej, jag hoppas att det finns någon här som kan hjälpa mig!

Jag läser programmering 1 och har fastnat på ett problem.

Jag har skapat en lista som innehåller objekt från en klass. I denna klass finns det ett attribut med ett visst värde.

Det jag vill göra är att sortera den här listan så att objekten hamnar i en viss ordning beroende på vilket värde detta attribut har, i storleksordning med andra ord.

Först så var jag inne på att göra en nästlad for-loop där två objekts attribut i listan jämförs. Det jag inte vet hur jag ska göra härnäst är hur de ska byta plats om den ena är större än den andra.

Jag uppskattar verkligen om svaren ni ger är på den nivå som jag förväntas skriva på.

Tack på förhand!

Kod:
public void SorteraSaldo()
    {
        for (int i = 0; i < kontoLista.Count; i++)
        {
            
            for (int j = 1; j <= kontoLista.Count; j++)
            {

                if (kontoLista[i].saldo > kontoLista[j].saldo)
                {

                   //Vad ska ske här?

                } 
            
            }
        }
    }

Edit: Det bästa skulle nog vara om det kunde ske med temporära variabler
__________________
Senast redigerad av jonatan36 2022-05-22 kl. 18:33.
Citera
2022-05-22, 18:23
  #2
Medlem
21512s avatar
Citat:
Ursprungligen postat av jonatan36
Hej, jag hoppas att det finns någon här som kan hjälpa mig!

Jag läser programmering 1 och har fastnat på ett problem.

Jag har skapat en lista som innehåller objekt från en klass. I denna klass finns det ett attribut med ett visst värde.

Det jag vill göra är att sortera den här listan så att objekten hamnar i en viss ordning beroende på vilket värde detta attribut har, i storleksordning med andra ord.

Först så var jag inne på att göra en nästlad for-loop där två objekts attribut i listan jämförs. Det jag inte vet hur jag ska göra härnäst är hur de ska byta plats om den ena är större än den andra.

Jag uppskattar verkligen om svaren ni ger är på den nivå som jag förväntas skriva på.

Tack på förhand!

Kod:
public void SorteraSaldo()
    {
        for (int i = 0; i < kontoLista.Count; i++)
        {
            
            for (int j = 1; j <= kontoLista.Count; j++)
            {

                if (kontoLista[i].saldo > kontoLista[j].saldo)
                {

                   //Vad ska ske här?

                } 
            
            }
        }
    }
Jag är ingen hejare på C# precis, men har sorterat så här i C# ganska nyligen. Testa det här t.ex.:
Kod:
List<Order> sorteradeKonton = kontoLista.OrderBy(o=>o.saldo).ToList();
Citat:
The easiest way I can think of is to use Linq:
https://stackoverflow.com/a/3309230
Citera
2022-05-22, 18:46
  #3
Medlem
a-mortals avatar
Uppgiften handlar nog om att tillämpa algoritmer. Sådant får du googla på.
Här har jag bara skrivit utan att testa eller att googla någon algoritm, men det kanske ger dig ett hum om hur det kan fungera.
Kod:
public void SorteraSaldo()
    {
        Konto tmp;
        int minimum;
        for (int i = 0; i < kontoLista.Count-1; i++)
        {
            minimum = i;
            for (int j = i+1; j < kontoLista.Count; j++)
            {
                if (kontoLista[minimum].saldo > kontoLista[j].saldo)
                {
                   minimum = j;
                } 
            }
            if (i === minimum) continue;
            tmp = kontoLista[i];
            kontoLista[i] = kontoLista[minimum];
            kontoLista[minimum] = tmp;
        }
    }
Citera
2022-05-23, 19:25
  #4
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av jonatan36
Hej, jag hoppas att det finns någon här som kan hjälpa mig!

Jag läser programmering 1 och har fastnat på ett problem.

Jag har skapat en lista som innehåller objekt från en klass. I denna klass finns det ett attribut med ett visst värde.

Det jag vill göra är att sortera den här listan så att objekten hamnar i en viss ordning beroende på vilket värde detta attribut har, i storleksordning med andra ord.

Först så var jag inne på att göra en nästlad for-loop där två objekts attribut i listan jämförs. Det jag inte vet hur jag ska göra härnäst är hur de ska byta plats om den ena är större än den andra.

Jag uppskattar verkligen om svaren ni ger är på den nivå som jag förväntas skriva på.

Tack på förhand!

Kod:
public void SorteraSaldo()
    {
        for (int i = 0; i < kontoLista.Count; i++)
        {
            
            for (int j = 1; j <= kontoLista.Count; j++)
            {

                if (kontoLista[i].saldo > kontoLista[j].saldo)
                {

                   //Vad ska ske här?

                } 
            
            }
        }
    }

Edit: Det bästa skulle nog vara om det kunde ske med temporära variabler

Enklast är att du kör en klassisk bubble sort, dvs. att du sorterar alla element i listan genom att göra parvisa jämförelser tills alla element i listan följer stigande ordning. Eftersom du inte rangordnar själva objekten i sig (utan deras attribut) så gör du jämförelsen på basis av saldot för resp. närliggande element i listan - om saldot i nästkommande konto är lägre än saldot i föregående konto byter du plats på kontona. Du kan då mellanlagra värdet av det första kontot i en tillfällig variabel.

Kod:
public void SorteraSaldo()
{
    var temp;
    for (int i = 0; i < kontoLista.Count; i++)
    {
        for (int j = 0; j <= kontoLista.Count; j++)
        {
            if (kontoLista[j].saldo > kontoLista[j+1].saldo)
            {
                temp = kontoLista[j];
                kontoLista[j] = kontoLista[j+1];
                kontoLista[j+1] = temp;
            } 
        }
    }
}
Citera
2022-05-23, 22:09
  #5
Medlem
jonatan36s avatar
Citat:
Ursprungligen postat av Pontiac-Garage
Enklast är att du kör en klassisk bubble sort, dvs. att du sorterar alla element i listan genom att göra parvisa jämförelser tills alla element i listan följer stigande ordning. Eftersom du inte rangordnar själva objekten i sig (utan deras attribut) så gör du jämförelsen på basis av saldot för resp. närliggande element i listan - om saldot i nästkommande konto är lägre än saldot i föregående konto byter du plats på kontona. Du kan då mellanlagra värdet av det första kontot i en tillfällig variabel.

Kod:
public void SorteraSaldo()
{
    var temp;
    for (int i = 0; i < kontoLista.Count; i++)
    {
        for (int j = 0; j <= kontoLista.Count; j++)
        {
            if (kontoLista[j].saldo > kontoLista[j+1].saldo)
            {
                temp = kontoLista[j];
                kontoLista[j] = kontoLista[j+1];
                kontoLista[j+1] = temp;
            } 
        }
    }
}

Tack för svar, det ser ut som något jag borde kunna fixa!

BTW, när jag har skapat en lista och försöker att lägga till ett objekt i den får jag ett felmeddelande som säger att "index was out of range" för listan. Du råkar inte veta hur man löser det? (känns lite onödigt att skapa en helt ny tråd för det och hittar inget jag förstår på internet)

Kod:
int i = 0;
static List<Konto> KontoLista = new List<Konto>();
KontoLista[i] = new Konto(saldo, customer, isMale);
Citera
2022-05-23, 22:15
  #6
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av jonatan36
Tack för svar, det ser ut som något jag borde kunna fixa!

BTW, när jag har skapat en lista och försöker att lägga till ett objekt i den får jag ett felmeddelande som säger att "index was out of range" för listan. Du råkar inte veta hur man löser det? (känns lite onödigt att skapa en helt ny tråd för det och hittar inget jag förstår på internet)

Kod:
int i = 0;
static List<Konto> KontoLista = new List<Konto>();
KontoLista[i] = new Konto(saldo, customer, isMale);
Kolla det accepterade svaret, andra stycket (.Add())
https://stackoverflow.com/questions/...-c-sharp-array
Citera
2022-05-23, 23:46
  #7
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av jonatan36
Tack för svar, det ser ut som något jag borde kunna fixa!

BTW, när jag har skapat en lista och försöker att lägga till ett objekt i den får jag ett felmeddelande som säger att "index was out of range" för listan. Du råkar inte veta hur man löser det? (känns lite onödigt att skapa en helt ny tråd för det och hittar inget jag förstår på internet)

Kod:
int i = 0;
static List<Konto> KontoLista = new List<Konto>();
KontoLista[i] = new Konto(saldo, customer, isMale);

Som föreslås ovan, Add() låter en lista växa dynamiskt.
Citera
2022-05-24, 00:32
  #8
Medlem
jonatan36s avatar
Citat:
Ursprungligen postat av Enterprise
Kolla det accepterade svaret, andra stycket (.Add())
https://stackoverflow.com/questions/...-c-sharp-array

Okej det fungerade!
Det jag undrar härnäst är hur jag kommer åt och skriver ut objektet?
I vanliga fall så namnger man ju objektet man skapar, t.ex: Klass NamnPåObjekt = new Klass();

Detta sker dock inte när ett objekt automatiskt skapas och läggs till i listan:
Kod:
KontoLista.Add(new Konto(saldo, customer, isMale))

Om jag vill skriva ut värdena på attributen som objektet innehåller som ligger i listan, hur gör jag då?
Med tanke på att jag inte har något namn att refarera till?

Om jag prövar att skriva ut det med:
Kod:
Console.WriteLine(KontoLista[0]);
så får jag bara "bank.konto", alltså verkar det inte fungera att bara använda sig av index som man skulle i en vektor. Finns det då inget system som man kan använda för att identifiera ett enskilt objekt i listan?

Mycket tacksam för hjälpen!
Citera
2022-05-24, 09:12
  #9
Moderator
Protons avatar
Citat:
Ursprungligen postat av jonatan36
Okej det fungerade!
Det jag undrar härnäst är hur jag kommer åt och skriver ut objektet?
I vanliga fall så namnger man ju objektet man skapar, t.ex: Klass NamnPåObjekt = new Klass();

Detta sker dock inte när ett objekt automatiskt skapas och läggs till i listan:
Kod:
KontoLista.Add(new Konto(saldo, customer, isMale))

Om jag vill skriva ut värdena på attributen som objektet innehåller som ligger i listan, hur gör jag då?
Med tanke på att jag inte har något namn att refarera till?

Om jag prövar att skriva ut det med:
Kod:
Console.WriteLine(KontoLista[0]);
så får jag bara "bank.konto", alltså verkar det inte fungera att bara använda sig av index som man skulle i en vektor. Finns det då inget system som man kan använda för att identifiera ett enskilt objekt i listan?

Mycket tacksam för hjälpen!
Den där koden gör ju precis det som står i den.

Kompilatorn har ingen aning om vad "konto" är för klass eller hur den ska hanteras. Det den däremot vet är att när den stöter på en utskrift av ett konto kommer den att anropa ToString i kontoklassen.

Eftersom du inte overridat den kommer kompilatorn ta första bästa ToString den kan få tag på, nämligen den som du implicit ärver från Object.

Ska du ha ut nåt annat när du skriver ut ditt kontoobjekt får du tala om HUR det ska ske, genom att overrida ToString.

Att skriva ut enskilda properties är ju däremot inga problem, du behöver får tag på objektet och sen anropa getpropertyn.

Kod:
Console.WriteLine(KontoLista[0].Customer);
till exempel.

Du kommer få samma problem oavsett om du lägger det i en array, kompilatorn kommer fortfarande inte veta hur man skriver ut ett objekt av typen "konto" om du inte explicit talar om hur det ska göras. Du kan ju prova själv:

Kod:
var myArray = KontoLista.ToArray();
Console.WriteLine(myArray[0]);
Citera
2022-05-24, 12:51
  #10
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av jonatan36
Om jag vill skriva ut värdena på attributen som objektet innehåller som ligger i listan, hur gör jag då?
Med tanke på att jag inte har något namn att refarera till?

Enklast är ju att du lagrar värdena av attributen i ett property för klassen, som du sedan anropar för att skriva ut dessa värden i huvudprogrammet och/eller i funktioner. Ge då åtkomst via get.
Citera
2022-05-25, 03:44
  #11
Medlem
jonatan36s avatar
Citat:
Ursprungligen postat av Pontiac-Garage
Enklast är att du kör en klassisk bubble sort, dvs. att du sorterar alla element i listan genom att göra parvisa jämförelser tills alla element i listan följer stigande ordning. Eftersom du inte rangordnar själva objekten i sig (utan deras attribut) så gör du jämförelsen på basis av saldot för resp. närliggande element i listan - om saldot i nästkommande konto är lägre än saldot i föregående konto byter du plats på kontona. Du kan då mellanlagra värdet av det första kontot i en tillfällig variabel.

Kod:
public void SorteraSaldo()
{
    var temp;
    for (int i = 0; i < kontoLista.Count; i++)
    {
        for (int j = 0; j <= kontoLista.Count; j++)
        {
            if (kontoLista[j].saldo > kontoLista[j+1].saldo)
            {
                temp = kontoLista[j];
                kontoLista[j] = kontoLista[j+1];
                kontoLista[j+1] = temp;
            } 
        }
    }
}

Problemet när jag prövar sorteringsmetoden med bubblesort är att jag sorterar objekten i listan och inte några andra datatyper, till exempel integrer. Det gör att objektet inte kan lagras i den tillfälliga variabeln för att sedan kunna byta plats. Konsolen tillåter inte heller att man endast deklarerar en variabel med "var" som ovan utan specificerad datatyp.
Finns det något sätt att lagra ett objekt i en variabel?
Citera
2022-05-25, 08:26
  #12
Medlem
a-mortals avatar
Citat:
Ursprungligen postat av jonatan36
Problemet när jag prövar sorteringsmetoden med bubblesort är att jag sorterar objekten i listan och inte några andra datatyper, till exempel integrer. Det gör att objektet inte kan lagras i den tillfälliga variabeln för att sedan kunna byta plats. Konsolen tillåter inte heller att man endast deklarerar en variabel med "var" som ovan utan specificerad datatyp.
Finns det något sätt att lagra ett objekt i en variabel?

Kod:
Konto tmp = kontoLista[0];
Har du testat om min kod fungerar?
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in