Jag har försökt förstå hur insättningssortering och bubbelsortering av Lista fungerar i C#. Men kan inte riktigt förstå. Är det någon som kan förklara enkelt hur det går till med ett exempel? det där låter nästan som en skoluppgift.. Jag får det att funka när jag bara använder tal men behöver sortera strängar i en lista och då så fungerar inte det för mig. Jag har inte kvar den som den var för talen men så här ser den ut när jag försökt lösa det med strängar. Innan så jämförde jag talen i if-satsen genom if(film < film2). Jag antar att din arraylist är fylld med objekt av typen SRegistry som du har definierat någonstans. För att kunna använda CompareTo måste SRegistry implementera interfacet IComparable, då kan du definiera en CompareTo-metod is klassen som definierar hur du ska sortera objektem: Jag vet inte riktigt hur jag ska få in det men visar de relevanta kodsnuttarna här: Tittade lite kvickt och såg ett par missar :) Tack så jätte mycket för all hjälp Om du ser på mitt exempel så använder jag inte klassens definition av CompareTo, jag använder istället string-CompareTo och int-CompareTo beroende på vad du vill sortera efter. Testade det innan men fick då följande felmeddelande Hoppsan :) Tack för hjälpen, fick det att fungera nu.Sortering av Arraylist
Sv: Sortering av Arraylist
För övrigt finns det bl.a. java applets på webben som visar hur dom funkar..Sv:Sortering av Arraylist
Sv:Sortering av Arraylist
for (i = (Registry.Count - 1); i >= 0; i++)
{
for (j = 1; j <= i; j++)
{
SRegistry film = (SRegistry)Registry[j]; // används för att plocka ut titel ur Registry[j]
SRegistry film2 = (SRegistry)Registry[j - 1]; // används för att plocka ut titel ur Registry[j-1]
resultat = film.CompareTo(film2);
if (resultat < 0)
{
temp = Registry[j-1];
Registry[j-1] = Registry[j];
Registry[j] = temp;
}
}
}
Läste någonstans om CompareTo, men Visual Studio klagar när jag testar programmet så det kanske inte går att använda den.Sv: Sortering av Arraylist
Ex:
public class SRegistry:IComparable
{
public string Titel{get;get;}
public int CompareTo(object obj)
{
SRegistry other = obj as SRegistry;
if (other != null)
return this.Titel.CompareTo(other.Titel);
return 0;
}
}
Edit:
Läste precis igenom vad jag sktivit och det låter lite skumt :)
Givetvis måste du inte implementera interfacet för att få ha en metod CompareTo i din klass. Det behövs bara om du vill vara lat och använda en automatisk sort-metod på din collection. (men det är god form att implementera interfacet :) )
Sv:Sortering av Arraylist
public class Funktioner
{
struct SRegistry:IComparable
{
public string Title;
public string Publisher;
public string Language;
public int ReleaseYear;
public int Runtime;
public SRegistry(string title, string publisher, string language, int releaseyear, int runtime)
{
this.Title = title;
this.Publisher = publisher;
this.Language = language;
this.ReleaseYear = releaseyear;
this.Runtime = runtime;
}
public int CompareTo(object obj)
{
SRegistry other = obj as SRegistry;
if
}
}
}
public void SortMovies(ArrayList Registry) // Sortera katalog - ej klar
{
int i, j, resultat; // Styr looparna
object temp;
string val;
// Meny alternativ
Console.Clear();
Console.Write(" Vad vill du sortera efter?\n 1. Filmernas namn\n 2. Utgivare (ur funktion)\n 3. Utgivningsår (ur funktion)\n 4. Språk (ur funktion)\n\n val:");
val = Console.ReadLine();
switch (val)
{
case "1": // 1. Sortera efter filmernas namn
for (i = (Registry.Count - 1); i >= 0; i++)
{
for (j = 1; j <= i; j++)
{
SRegistry film = (SRegistry)Registry[j]; // används för att plocka ut titel ur Registry[j]
SRegistry film2 = (SRegistry)Registry[j - 1]; // används för att plocka ut titel ur Registry[j-1]
resultat = film.CompareTo(film2);
if (resultat < 0)
{
temp = Registry[j-1];
Registry[j-1] = Registry[j];
Registry[j] = temp;
}
}
}
break;
}
}Sv: Sortering av Arraylist
Eftersom du har en liten meny där man kan välja vad man vill sortera efter tänkte jag att det är lite onödigt att klura till den med IComparable... Bara att köra med switch-satsen i din metod istället!
Testade att fippla lite med din sorteringsmetod, har inte testat den alls men det borde fungera (i teorin) :)
public void SortMovies(ArrayList Registry) // Sortera katalog - ej klar
{
//int i, j, resultat; // Styr looparna
//object temp;
string val;
int compResult = 0; // resultatet vid jämföring av två objekt
// Meny alternativ
Console.Clear();
Console.Write(" Vad vill du sortera efter?\n 1. Filmernas namn\n 2. Utgivare\n 3. Utgivningsår\n 4. Språk\n\n val:");
val = Console.ReadLine();
// Används för att kolla ifall ett helt varv av arraylisten är körd utan att något byte gjorts
bool cleanRun = true;
// loopa tills vi kallar break
while (true)
{
for (int i=0;i<Registry.Count - 1;i++)
{
SRegistry theOne = Registry[i] as SRegistry;
SRegistry theOther = Registry[i+1] as SRegistry;
// beroende på val i menyn så sorterar vi på olika saker...
switch (val) {
case "1":
compResult = theOne.Title.CompareTo(theOther.Title);
break;
case "2":
compResult = theOne.Publisher.CompareTo(theOther.Publisher);
break;
case "3":
compResult = theOne.ReleaseYear.CompareTo(theOther.ReleaseYear);
break;
case "4":
compResult = theOne.Language.CompareTo(theOther.Language);
break;
default:
throw new NotImplementedException("felaktigt val i menyn");
break;
}
// Byta plats på objekten
if (compResult > 0)
{
Registry[i+1] = theOne;
Registry[i] = theOther;
// eftersom vi hittat något som ej var sorterat så kan vi inte avsluta efter denna rundan
cleanRun = false;
}
}
// om vi gått igenom alla objekten utan att byta plats så är listan sorterad och vi är färdiga
if (cleanRun == true)
break;
}
}
Sv:Sortering av Arraylist
Ska detta fortfarande in i klassen Funktioner?
För ifall jag tar bort det så klagar programmet på att CompareTo saknas.
public string Titel{get;get;}
public int CompareTo(object obj)
{
SRegistry other = obj as SRegistry;
if(other != null)
return this.Titel.CompareTo(other.Title);
return 0;
}Sv: Sortering av Arraylist
Om du gbör så kan du ta bort CompareTo från din struct, men då måste du även ta bort så den inte implementerar IComparable-interfacet (annars klagar kompilatorn på att CompareTo saknas)Sv:Sortering av Arraylist
"Error 1 The as operator must be used with a reference type or nullable type ('Filmkatalog.Funktioner.SRegistry' is a non-nullable value type) d:\mina dokument\Visual Studio 2008\Projects\Filmkatalog\Filmkatalog\Program.cs 611 40 Filmkatalog"
på raderna:
SRegistry theOne = Registry[i] as SRegistry;
SRegistry theOther = Registry[i+1] as SRegistry;Sv: Sortering av Arraylist
Tänkte inte på att en struct är en value-typ och inte kan vara null.
Grejen med att göra casting med
SRegister reg = Register[i] as SRegister;
istället för
SRegister reg = (SRegister) Register[i];
är att objektet blir null istället för att ett exception kastas om castingen misslyckas. Eftersom det är en struct så får det inte bli null och den översta tekniken är olaglig. Kör på den nedersta varianten istället.
Sv:Sortering av Arraylist
Jag provade faktiskt det du skrev innan för att det är så jag gjort tidigare. Men då stannade den och kom ingenstans men det var nog för att jag inte hade något som gav cleanRun värdet true när den var klar.
Återigen tack för all din hjälp!