Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Sortering av Arraylist

Postades av 2008-12-22 07:39:46 - Johan Dahlberg, i forum c# (c-sharp), Tråden har 12 Kommentarer och lästs av 2644 personer

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?


Svara

Sv: Sortering av Arraylist

Postades av 2008-12-22 09:00:44 - Simon Dahlbacka

det där låter nästan som en skoluppgift..
För övrigt finns det bl.a. java applets på webben som visar hur dom funkar..


Svara

Sv:Sortering av Arraylist

Postades av 2008-12-23 20:05:17 - Johan Dahlberg

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.


Svara

Sv: Sortering av Arraylist

Postades av 2008-12-24 00:57:24 - Johan Djupmarker

Posta gärna hur du löst det med talen...

/Johan


Svara

Sv:Sortering av Arraylist

Postades av 2008-12-24 09:06:11 - Johan Dahlberg

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).


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.


Svara

Sv: Sortering av Arraylist

Postades av 2008-12-24 11:12:02 - Magnus Bergström

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:

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 :) )


Svara

Sv:Sortering av Arraylist

Postades av 2008-12-24 18:58:35 - Johan Dahlberg

Jag vet inte riktigt hur jag ska få in det men visar de relevanta kodsnuttarna här:

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;
}
}


Svara

Sv: Sortering av Arraylist

Postades av 2008-12-25 01:29:56 - Magnus Bergström

Tittade lite kvickt och såg ett par missar :)

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;
            }
        }


Svara

Sv:Sortering av Arraylist

Postades av 2008-12-25 13:05:58 - Johan Dahlberg

Tack så jätte mycket för all hjälp

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;
}


Svara

Sv: Sortering av Arraylist

Postades av 2008-12-25 16:29:35 - Magnus Bergström

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.

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)


Svara

Sv:Sortering av Arraylist

Postades av 2008-12-25 16:42:37 - Johan Dahlberg

Testade det innan men fick då följande felmeddelande

"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;


Svara

Sv: Sortering av Arraylist

Postades av 2008-12-25 20:35:13 - Magnus Bergström

Hoppsan :)

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.


Svara

Sv:Sortering av Arraylist

Postades av 2008-12-25 22:52:20 - Johan Dahlberg

Tack för hjälpen, fick det att fungera nu.
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!


Svara

Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 801
27 960
271 761
583
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies