Permalänk
Medlem

Sortering av vektor i C#

Hej,

Jag försöker skapa en applikation som sorterar fälgar efter pris från en extern fil.
Programmet läser in fälgarna från en extern fil och lägger dem i en vektor, dock utan sortering.
Fälgarna består av en class med olika egenskaper (t.ex. price och numberOfBolts).

Jag vill att vektorn som skapas ska sorteras på pris, alltså att fälgen med lägst pris ska komma först, och den med högst ska komma sist.

Har försökt skriva så här, men Visual Studio gnäller på att Swap inte finns (trots att jag läst om det.. hmm..):

public static void SortVector(Rim[] vector)
{
bool unsorted = true;

int end = vector.Length - 1;

while (unsorted)
{
unsorted = false;
for (int j = 0; j < end; j++)
{
if (vector[j].price > vector[j + 1].price)
{

Swap(vector, j, j + 1);
unsorted = true;
}
}
end--;
}

}

Vektorn den tar in har massa fälgar i sig, men är som sagt osorterad. Verkar funka i övrigt, då programmet inte klagar över något förutom just Swap.
Finns det något annat sätt att göra det på?

Visa signatur

Stationär: i5 2500K @ 4.3 GHz / GTX570 / 8GB @ 1600MHz / P8Z68-V Pro / 120GB SSD + 320 GB HDD / HX650 / FD Define R3 / W7 64 bit
Bärbart: 13.3" MacBook Pro / iPhone 4 / Nikon D80 + 18-135/3.5-5.6 + 50/1.8D
Hemmabio: Samsung 40" UE40D6515 / Yamaha RX-V465 + Canton GLE 490 (MW)
Kaffe: Moccamaster KB741 || Planerat: Rancilio Silvia + Gaggia MDF

Permalänk
Medlem

Du kan använda dig av Array.Sort() och implementera IComparable för din klass. Exempel på detta.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Jag har för mig att Vector-klassen inte finns sedan .Net 2.0.
Jag rekommenderar att köra med generiska listor istället.

void metod1() { List<Rim> myRims = getAllRims(); //Alternativ 1 myRims.Sort(sortRimsByPrice); //Alternativ 2 myRims.Sort(delegate(Rim rim1, Rim rim2) { return rim1.Price.CompareTo(rim2.Price); }); //Ett till alternativ är att göra en Comparer-klass, men det känns overkill. } //Tillhör alternativ1 - Läggs lämpligen i Rim-klassen private static int sortRimsByPrice(Rim rim1, Rim rim2) { return rim1.Price.CompareTo(rim2.Price); }

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

Eller så använder man sig av en generisk lista och LINQ och kan då sortera med hjälp av :

List<Rim> rims = new List<Rim>(); rims = rims.OrderBy(rim=>rim.Price).ToList();

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

KurreKula's lösning är 3.0/3.5, min är 2.0.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Citat:

Ursprungligen inskrivet av Leedow
KurreKula's lösning är 3.0/3.5, min är 2.0.

Sant, det skrev jag aldrig

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Tack så mycket för hjälpen!

@Phod, jag ska kika på ditt förslag.

Det är för .Net 2.0 jag söker lösningen.

Det är en uppgift i grundläggande programmering på högskolan, och vi har dessvärre förhållningsregler. En av dessa är att vi inte får använda listor, utan måste använda vektorer.
Hela mitt program är klart i övrigt, med allt vad inläsning, skrivning, sökning, sparning etc. innebär. Det är enbart sorteringen som strular.

Det roliga är att mina lärare använder Swap i sina exempel, men jag får det inte att fungera. Har jag missat någon using-sats i början?

Felet jag får är "The name 'Swap' does not exist in the current context"

Visa signatur

Stationär: i5 2500K @ 4.3 GHz / GTX570 / 8GB @ 1600MHz / P8Z68-V Pro / 120GB SSD + 320 GB HDD / HX650 / FD Define R3 / W7 64 bit
Bärbart: 13.3" MacBook Pro / iPhone 4 / Nikon D80 + 18-135/3.5-5.6 + 50/1.8D
Hemmabio: Samsung 40" UE40D6515 / Yamaha RX-V465 + Canton GLE 490 (MW)
Kaffe: Moccamaster KB741 || Planerat: Rancilio Silvia + Gaggia MDF

Permalänk
Medlem

Swap är väl antagligen en metod som din lärare har skapat...

I den här tråden http://www.sweclockers.com/forum/showthread.php?s=&threadid=9... har swap-metod berörts lite..

Bubblesort brukar va populärt i grundläggande programmering.
http://en.wikipedia.org/wiki/Bubble_sort
Inte optimalt, men ändå bra att kunna..

Permalänk

Låter snarare som att din lärare har skrivit en helperfunktion "Swap"

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av KurreKula
Låter snarare som att din lärare har skrivit en helperfunktion "Swap"

Jag "vann" med några sekunder..

Permalänk
Citat:

Ursprungligen inskrivet av Kalle87
Jag "vann" med några sekunder..

Tusan

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Om du vill bygga din egen sort-funktion så kan du alltid bygga din egna swap oxå. Det är inte så svårt, allt den ska göra är att byta plats på element j med element (j+1) i vektorn.

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Medlem

Tack så mycket för hjälpen!
Varför tänkte jag inte på att skapa en Swap-funktion, dum man kan vara då

Löste det såhär:

public static void Swap(Rim[] rims,int a, int b)
{
int temp = rims[a].price;
rims[a].price = rims[b].price;
rims[b].price = temp;
}

public static void SortVector(Rim[] vector)
{
bool unsorted = true;

int end = vector.Length - 1;

while (unsorted)
{
unsorted = false;
for (int j = 0; j < end; j++)
{
if (vector[j].price > vector[j + 1].price)
{

Swap(vector, j, (j + 1));
unsorted = true;
}
}
end--;
}

}

Visa signatur

Stationär: i5 2500K @ 4.3 GHz / GTX570 / 8GB @ 1600MHz / P8Z68-V Pro / 120GB SSD + 320 GB HDD / HX650 / FD Define R3 / W7 64 bit
Bärbart: 13.3" MacBook Pro / iPhone 4 / Nikon D80 + 18-135/3.5-5.6 + 50/1.8D
Hemmabio: Samsung 40" UE40D6515 / Yamaha RX-V465 + Canton GLE 490 (MW)
Kaffe: Moccamaster KB741 || Planerat: Rancilio Silvia + Gaggia MDF