[C#] List<int> Sorteer aflopend

Pagina: 1
Acties:

  • Aloys
  • Registratie: Juni 2005
  • Niet online
Tja, mijn titel legt het hele probleem denk ik al uit :P. Ik wil dus een List sorteren, das allemaal geen probleem. Maar het probleem is dat het aflopend moet, omdat ik dus bepaalde items uit een lijst wil verwijderen.

Ff uitlegje: Wanneer ik een lijst met getallen heb van de indexen van items die verwijdert moeten worden, en je begint bij de laagste, zul je het probleem hebben dat alle items 1 plek doorschuiven. Dat probleem heb je geen last van wanneer je achteraan begint met verwijderen.

Ik heb al gezocht in de msdn van microsoft en op google, en ben er al wel achter dat ik iets met CompareTo met Sort moet doen. Maar hoe werkt dat ooit? :?. Iemand die me dat kan uitleggen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Je kan een eigen Sorteer class maken, die IComparable implementeert. Je vergelijkt de x en de y, en het resultaat vermenigvuldig je met -1 en dat return je dan.

Maareh, als het enkel om het verwijderen gaat, dan kan je toch ook die lijst van achter naar voor doorlopen, en zo verwijderen ?
code:
1
2
3
4
5
for( int i = theList.Count - 1; i >= 0; i-- )
{
   if( .... )
       theList.RemoveAt (i);
}

https://fgheysels.github.io/


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08 23:34
ziehier: http://blogs.msdn.com/brada/archive/2004/04/15/114129.aspx

Die CompareTo wordt door het framework gebruikt om te bepalen dat element X kleiner is dan een ander element Y. Uw reverse sort, zal dus een CompareTo moeten implementeren die zegt dat element X groter is dan element Y.

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


  • Aloys
  • Registratie: Juni 2005
  • Niet online
Ik had precies het zelfde stukje code als jouw, alleen zonder die >= ;( (ik had >) Waarom moet ik weer moeilijk doen? :+ Thnx Whoami :)

edit: Weet alweer waarom ik moeilijk deed: Had mijn code vervangen voor een foreach loopje. Dus als dat Comparable niet zo moeilijk is wil je het dan uitleggen?

[ Voor 37% gewijzigd door Aloys op 28-03-2007 16:13 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Of, je kan ook gebruik maken van de Comparision delegate in .NET 2.0:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<int> l = new List<int>();
l.Add (1);
l.Add (5);
l.Add (3);
l.Add (10);

l.Sort (new Comparision<int> (ReverseCompare));

..

private int ReverseCompare(int x, int y)
{
   return Comparer<int>.Default.Compare (x, y) * -1;
}


mooi he. :)

https://fgheysels.github.io/


  • Aloys
  • Registratie: Juni 2005
  • Niet online
ghgh _/-\o_

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Maar je kan ook dit doen:
code:
1
2
3
4
5
6
7
public class ReverseIntegerSorter : IComparable<int>
{
    public int Compare(int x, int y)
    {
         return Comparer<int>.Default.Compare (x, y) * -1;
    }
}

En dan deze zo gebruiken:
code:
1
2
3
4
5
6
7
8
List<int> l = new List<int>();
l.Add (4);
l.Add (30);
l.Add (1);
l.Add (5);
l.Add (3);

l.Sort (new ReverseIntegerSorter());

https://fgheysels.github.io/


  • dotcode
  • Registratie: Augustus 2003
  • Nu online

dotcode

///\00/\\

code:
1
2
list.Sort();
list.Reverse();

  • Aloys
  • Registratie: Juni 2005
  • Niet online
nog meer gejank hier.... Dacht dat die Reverse niet bestond?? Was zeker zo bij ArrayList, want dat gebruikte ik eerst. Naja, gelukkig heb ik het nu werkend.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Waarom gebruik je niet List<T>.RemoveAll(Predicate<U>) ? Dat kan dan in 1 regel, waarbij je een anonymous method gebruikt in een delegate die bv kijkt of de waarde in een lijstje staat van te verwijderen getallen. Dus iets als:
C#:
1
2
3
4
5
6
7
8
9
10
11
List<int> toRemove = new List<int>();
toRemove.Add(1);
toRemove.Add(2);

List<int> numbers = new List<int>();
for(int i = 0; i < 10; i++)
{
    numbers.Add(i);
}

numbers.RemoveAll(delegate(int toCheck) { return toRemove.Contains(toCheck);});

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

@whoami: Waarom eigenlijk een vermenigvuldiging met -1 en niet gewoon de - operator gebruiken?

[ Voor 8% gewijzigd door .oisyn op 28-03-2007 16:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Omdat ik dat duidelijker / leesbaarder vind dan
code:
1
-Comparer<int>.Default.Compare ( ... )

:P

Maar die oplossing van EfBe is wel cool. :P

[ Voor 18% gewijzigd door whoami op 28-03-2007 17:27 ]

https://fgheysels.github.io/


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Waarom niet y.CompareTo( x ) ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Aloys
  • Registratie: Juni 2005
  • Niet online
EfBe schreef op woensdag 28 maart 2007 @ 16:54:
Waarom gebruik je niet List<T>.RemoveAll(Predicate<U>) ? Dat kan dan in 1 regel, waarbij je een anonymous method gebruikt in een delegate die bv kijkt of de waarde in een lijstje staat van te verwijderen getallen. Dus iets als:
C#:
1
2
3
4
5
6
7
8
9
10
11
List<int> toRemove = new List<int>();
toRemove.Add(1);
toRemove.Add(2);

List<int> numbers = new List<int>();
for(int i = 0; i < 10; i++)
{
    numbers.Add(i);
}

numbers.RemoveAll(delegate(int toCheck) { return toRemove.Contains(toCheck);});
Gaat op deze manier niet werken in mijn geval. Want ik moet een string uit een List verwijderen. En dat is de string met de index toRemove[huppeldepup]. ;)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Dan moet je inderdaad de indices sorten en dan afsjouwen. Wat je ook kunt doen, en wellicht is dat efficienter, is een lijst aanmaken van de strings op de indices die je moet verwijderen en dan die RemoveAll gebruiken warbij toRemove de strings bevat die je wilt verwijderen. Scheelt een sort.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Aloys
  • Registratie: Juni 2005
  • Niet online
Is een sort zo langzaam dan?... (Tis btw voor de contest... dus snelheid is interresant.)

  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01 15:07

6K

is ook zo...

list.Sort(delegate(int i1, int i2) { return i1.CompareTo(i2); });

volgens mij werkt dit ook
(ik doe het in de contest zo met objecten ipv ints)

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

EfBe schreef op donderdag 29 maart 2007 @ 19:06:
Dan moet je inderdaad de indices sorten en dan afsjouwen. Wat je ook kunt doen, en wellicht is dat efficienter, is een lijst aanmaken van de strings op de indices die je moet verwijderen en dan die RemoveAll gebruiken warbij toRemove de strings bevat die je wilt verwijderen. Scheelt een sort.
Een sort van een paar ints ja, waarna je gewoon lineair over je lijst heen kan lopen en op de goede plek de elementen kunt verwijderen. Anders moet je n*k string compares doen. Dat laatste lijkt me toch een stuk duurder ;).

De allereerste oplossing van whoami lijkt me toch het handigst

[ Voor 5% gewijzigd door .oisyn op 30-03-2007 11:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • it0
  • Registratie: April 2000
  • Laatst online: 16-08 10:24

it0

Mijn mening is een feit.

Aloys schreef op donderdag 29 maart 2007 @ 19:07:
[...]

Is een sort zo langzaam dan?... (Tis btw voor de contest... dus snelheid is interresant.)
Dat hangt van je algoritme en je lijst af. Hoe complexer het algoritme of hoe groter je lijst, hoe langer het duurt.

Daarom gebruikt men ook zo graag een hash of zo. Maar met computers van de huidige dag wordt dat dus een issue met zeer veel items.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
.oisyn schreef op vrijdag 30 maart 2007 @ 11:38:
[...]
Een sort van een paar ints ja, waarna je gewoon lineair over je lijst heen kan lopen en op de goede plek de elementen kunt verwijderen. Anders moet je n*k string compares doen. Dat laatste lijkt me toch een stuk duurder ;).
De allereerste oplossing van whoami lijkt me toch het handigst
Daar heb je ook weer gelijk in. Ikzelf gebruik zelden dit soort constructies vandaar dat ik dit finaal over het hoofd zag :$, zodra ik moet verwijderen uit een lijst gebruik ik een hashtable, indien mogelijk natuurlijk (een lijst met dupes kan niet) en dan heb je dit gezeik niet. Indexes in lijst 1 die verwijzen naar elementen in lijst 2 is overigens niet echt jofel, als je het kunt vermijden (dus als je geen 'view' bouwt op een lijst) dan zou ik dat zeker doen, dus ipv indices direct de references in de lijst gebruiken, eventueel keys gebruiken die je gebruikt als keys in een hashtable zodat je objects makkelijker opzoekt en ook weer verwijdert.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1