[Delphi] Item verwijderen uit array en array inkorten

Pagina: 1
Acties:

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Allereerst moet ik ff kwijt dat ik nog steeds een newbie ben met Delphi. Ik heb de search en de Help van Delphi gebruikt, maar ik kan niet vinden of wat ik wil makkelijk te doen is.

Wat ik wil is het Extracten/Removen van een record uit een Array van records, en dat als de record is weggehaald dat de Array automatisch wordt ingekort en alles opschuift.

Dus ik bijv volgende array:
[1,2,3,4,5]

Ik haal de 3 weg en dan moet er de volgende array komen
[1,2,4,5]
edit:

en niet [1,2, ,4,5] of [1,2,4,5, ]


Is dat mogelijk?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, je zal zelf de code daarvoor moeten schrijven. Bovendien kan je alleen een Dynamisch array inkorten.

We adore chaos because we like to restore order - M.C. Escher


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
LordLarry schreef op 08 May 2003 @ 13:35:
Nee, je zal zelf de code daarvoor moeten schrijven. Bovendien kan je alleen een Dynamisch array inkorten.
Het is een dynamische Array, dus dat is geen probleem.

Maar Delphi kent daar geen functies voor? Want voor Tlist enzo bestaan ze wel.

Heeft iemand misschien al zo'n code klaarliggen?

[ Voor 8% gewijzigd door Oscar Mopperkont op 08-05-2003 13:38 ]


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22-08 17:59

Knutselsmurf

LED's make things better

Met SetLength kun je de grootte van je array instellen. Wat je dus in je voorbeeld moet doen, is de waarden 4 en 5 naar links schuiven. Array[3]:=4 en array[4]:=5. Vervolgens kun je met setlength de afmeting van je array met 1 verminderen. Het laatste element verdwijnt dan.

- This line is intentionally left blank -


  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Wat jij eigenlijk wil is niet een array gebruiken maar een vector begrijp ik. Het gedrag van een element droppen is precies het gedrag van een vector. Trouwens een linked list is hier ook heel geschikt voor. Een vector is echter wat eenvoudiger.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Schmoove schreef op 08 May 2003 @ 13:43:
Wat jij eigenlijk wil is niet een array gebruiken maar een vector begrijp ik. Het gedrag van een element droppen is precies het gedrag van een vector. Trouwens een linked list is hier ook heel geschikt voor. Een vector is echter wat eenvoudiger.
Ik kan in de help van Delphi niks vinden over vectors, en wat is een linked list?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Wat Schmoove in dit verband met een vector bedoelt, begrijp ik niet. Misschien kan hij dat zelf toelichten.

Een linked list is efficiënt als je een set elementen hebt die vaak van plaats moeten verwisselen of wanneer je vaak elementen wilt tussenvoegen of verwijderen.

Een linked list is een rij elementen, waarbij ieder element een verwijzing naar het volgende element in de lijst heeft. Stel dat je in zo'n element een getal wilt bewaren, dan kan een element bijvoorbeeld zo zijn gedefinieerd:
Delphi:
1
2
3
4
5
6
type
  PElement = ^TElement;
  TElement = record
    ZomaarEenGetal: Integer;
    NextElement: PElement;
  end;

Wil je een bepaald element in de lijst bereiken, dan begin je bij het eerste element. Je vindt dan via NextElement het volgende element en herhaalt dat net zolang tot je het juiste element hebt gevonden. De elementen zijn als een ketting aan elkaar gekoppeld - een linked list.

Je kunt een nieuw element tussenvoegen door
  1. geheugen voor een nieuwe record te alloceren;
  2. NextElement van de nieuwe record de waarde te geven van NextRecord in het voorgaande element;
  3. NextElement van het voorgaande element te laten verwijzen naar de nieuwe record;
  4. ZomaarEenGetal van de nieuwe record de gewenste waarde te geven.
Als je dit begrijpt, begrijp je ook hoe je een element uit de linked list kunt verwijderen. Het laatste element van de linked list kun je trouwens aangeven door NextElement de waarde nil te geven.

Een beperking van een linked list is dat je als je veel elementen hebt, je een lange ketting langs moet om het laatste element van de linked list te vinden. Dit kun je ondervangen door een doubly-linked list te gebruiken. Daarin bevat ieder element niet alleen een verwijzing naar het volgende element, maar ook naar het voorgaande. Je kunt dan in twee richtingen de list doorlopen.

Een goede grap mag vrienden kosten.


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Knutselsmurf schreef op 08 May 2003 @ 13:38:
Met SetLength kun je de grootte van je array instellen. Wat je dus in je voorbeeld moet doen, is de waarden 4 en 5 naar links schuiven. Array[3]:=4 en array[4]:=5. Vervolgens kun je met setlength de afmeting van je array met 1 verminderen. Het laatste element verdwijnt dan.
Ik dacht dat ie dan zou crashen als ik de array inkort terwijl er buiten zijn bereik nog een waarde staat, maar ik heb het gedaan en het gebeurd niet en werkt goed.

Thnx

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 12:59

Creepy

Tactical Espionage Splatterer

tomatoman schreef op 08 May 2003 @ 14:13:
Wat Schmoove in dit verband met een vector bedoelt, begrijp ik niet. Misschien kan hij dat zelf toelichten.
Een vector is in feite een soort van linked list.
... een lang verhaal over een linked list ...
Waarbij ik dus op wil merken dat als je toch met Delphi bezig bent je de TList en consorten beter kan gebruiken. Scheelt je weer programmeer en denkwerk (en vooral tijd ;) ).

TS: Waarom gebruik je eigenlijk die dynamische array? Waarom niet een TObjectList bijv? Dan kan je dynamisch toevoegen/verwijderen en de TObjectList houd zelf de rest bij. Hoef je je ook geen zorgen te maken over het opschuiven, geheugen vrijgegeven etc.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Schmoove
  • Registratie: Juli 2001
  • Laatst online: 20-08 11:58
Wat is een vector (globaal)? Een vector is vergelijkebaar met een array, alleen is het volledig dynamisch. Je kunt er elementen in toevoegen op elke willerkeurige plek en alles schuift dan automatisch een plekje op als dat nodig is. Je kunt ook elementen verwijderen en dan schuif alles ook weer een plekje op zodat alles weer netjes aansluit.
Voordeel is dat je je niet druk hoeft te maken over de lengte van de vector, dat ding past zich automatisch aan.

Een vector is ideaal als je met een reeks elementen werkt waarvan het aantal steeds veranderd. Dus wanneer je array (als je dat gebruikt) steeds moet groeien en krimpen dan is het slimmer een vector te gebruiken, want die is veel simpeler te gebruiken. Nu is een vector als je kijkt naar performance niet echt het snelste wat je kan kiezen, je moet zo'n ding ook niet gaan gebruiken als je met hele grote datasets werkt, want dat automatisch aanpassen van de omvang kost wel rekenkracht natuurlijk.

In een geval van grote datasets kun je het beste een linked list pakken.... is wel een stuk lastiger te implementeren trouwens.

Maar goed, als je een vector zou willen gebruiken in Delphi dan zul je die zelf moeten programmeren (er zijn zat implementaties te vinden op internet, maar dat even terzijde). Ik geloof niet dat Delphi een TVector klasse heeft. C++ en Java hebben dat bijvoorbeeld wel.

Maar goed ik hoop dat het nu een beetje duidelijk is wat een vector doet.

EDIT: er lopen hier dus blijkbaar programmeurs rond die niet weten wat een vector is.... hmmm, vaag, ik was altijd in de veronderstelling dat het wel een algemeen bekend fenomeen was, naja.

[ Voor 7% gewijzigd door Schmoove op 08-05-2003 14:54 ]

Pagina: 1