jag har i min kod en loop där jag sparar ner en struct med data i en ArrayList. Problemet nu är hur man gör för att läsa från den. Eftersom du vill ta bort datan efter läsning så ska du inte använda en ArrayList utan en Queue eller Stack. Båda dessa finns i System.Collection-namespacet. private void timer_Tick(object s,eventargs e) DoRsal bara en observation. Som Roggan säger så är juh självklart en linked-list den mest lämpade implementationen för en Queue.. dumt att använda en array *blää* =) Roggan och Andreas : Tack för alla svar. Prestanda är inget viktigt i det jag ska göra då det max handlar om kanske 20 tal som ska sparas i kö. Jag har nu avänt mig av Queue och det fungerar precis så som jag tänkt mig. Tack för alla tipsen. Hultan, Andreas: > <b>Skulle däremot vara lite intressant om ni kunde förklara linked list lite bättre och kanske med något kodexempel.</b>ArrayList problem
Jag har en timer där jag vill läsa det första objektet som sattes in i ArrayListen för varje gång timern körs. När datan är läst så vill jag även ta bort den datan från arraylisten.
Hoppas ni förstår hur jag menar.
MVH JesperSv: ArrayList problem
<info>
Queue : FIFO = First In First Out, dvs som en kö till en kassa i affären. Den som ställde sig i kön först blir först betjänad.
Stack : LIFO = Last In First Out, dvs ungefär som en tallriksautomat som man ser på vissa restauranger, där man lägger tallrikar som hålls uppe av en fjäder. Lägger man till en tallrik så är det den första som tas bort från högen.
</info>
Hoppas att du förstår skillnaden.Sv: ArrayList problem
{
MyStruct ms=(MyStruct)MyArrayList[0];
MyArrayList.RemoveAt(0);
//gör någe kul med ms
}
//RogerSv: ArrayList problem
Hej, Vad du kan göra är att istället för ArrayLiust använda Queue classen. På så vis kommer översta posten alltid plockas ut med automatik.
Du har två metoder, Enqueue som lägger till saker i kön efter FIFO, för att plocka ut kör du Dequeue som då tar första posten och plockar bort den från Queue objektets collection.
<code>
Dim myQ As New Queue()
myQ.Enqueue("Hello")
myQ.Enqueue("World")
myQ.Enqueue("!")
</code>
=
0: Hello
1: World
2: !
<code>
object someObject myQ.Dequeue()
</code>
someObject blir Hello
och myQ har nu:
0: World
1: !
Med COunt kan du se hur stor din Queue är, med Peek metoden kan du plocka ut toppen för att titta på den utan att den raderas från din kö.
Mvh JohanSv: ArrayList problem
queue verkar vara redigt sunkigt skriven..
den använder en intern object[] som växer med 4 poster för var 4e sak som addas till den..
måste ge fruktat sunkiga prestanda om man lägger till stora mängder fort..
en vanlig simpel länkad lista måste väl iaf vara mer lämpad för att implementera en köklass (?)
där har man ju alltid tillgång till första och sista posten utan någon overhead och dessutom så kan man både lägga till och ta bort i början och slutet utan att någon array behvöver allokeras om.
//RogerSv: ArrayList problem
Sv: ArrayList problem
Det finns en konstruktor som delvis tar hand om problemet med många poster :
<info>
new Queue(capacity as Integer,growFactor as Single)
</info>Sv: ArrayList problem
Skulle däremot vara lite intressant om ni kunde förklara linked list lite bättre och kanske med något kodexempel.Sv: ArrayList problem
Japp men enbart, som du säger, delvis. Att skapa en länkad lista och en FIFO är döö enkelt. Kan förstå om man inte tycker det om man inte gjort det tidigare, men det finns tillräckligt med exempel och information om det på nätet för att kunna läsa på.. obs inte riktat till dig...ja inte till någon egentligen =)Sv: ArrayList problem
Det finns inget fel att använda en QueueAsArray, den enda nackdelen är att kön måste öka sin kapacitet när kön blir full, men sätter man initierar du en kö med ett förbestämt antal items så fungerar array utmärkt. Det är ingen större prestanda skillnand mellan en QueueAsArray och en QueueAsLinkedList mer än att QueueAsArray måste ev öka sin kapacitet (Skapa en ny array och kopiera det tidigare innehållet till den nya, men då används ofta en ökningsfaktor som sätter den nya arrayens storlek till den tillfälliga storleken*2. Ökningsfaktorn beror ofta på den som implementerar kön) om den interna arrayen är förliten.
Vill även nämna att Queue klassen som finns i .Net använder sig av en array internet och inte en länkad lista. Även Queue<T> i .Net 2.0 använder sig av en array internt.
/Fredrik Normén NSQUARED2
http://fredrik.nsquared2.comSv: ArrayList problem (LinkedList kodexempel)
Tja, kände för att koda några rader innan det är dags att natta sig själv. För att få ned antalet rader så har jag använt public fields i stället för properties som är snyggare. Det finns kanske bättre sätt att koda en länkad lista på, det är nästan 10 år sedan jag studerade algoritmer i skolan. Hur som helst så ger det väl dig en idé om hur det skulle kunna se ut i alla fall. Observera att jag har använt en variabel av datatypen Object för att hålla den faktiska datan i varje nod. Du kan (bör) byta ut detta mot den datatyp du själv vill använda eller vänta på generics i C# 2.0 :-)
Klassen Node - Innehåller information om föregående nod, nästa nod samt nodens data (Value)
using System;
namespace LinkedList
{
public class Node
{
public Node NextNode=null; // Sparar några rader kod genom att använda
public Node PreviousNode=null; // public field i stället för property
private object Value=null; // Ändra datatyp för optimerad LinkedList
public Node(object theValue)
{
Value=theValue;
}
public void Delete()
{
NextNode.PreviousNode=PreviousNode;
PreviousNode.NextNode=NextNode;
}
public override string ToString()
{
return Value.ToString ();
}
}
}
Klassen LinkedList - Huvudklassen
using System;
namespace LinkedList
{
/// <summary>
/// Summary description for LinkedList.
/// </summary>
public class LinkedList
{
public Node FirstNode=null; // Ändra till property
public Node LastNode=null; // Ändra till property
public LinkedList()
{
}
public Node AddFirst(object Value)
{
Node node=new Node(Value);
node.PreviousNode=null; // Första noden har ingen föregående nod
if (FirstNode==null) // Listan är tom
{
node.NextNode=null;
LastNode=node;
FirstNode=node;
}
else
{
FirstNode.PreviousNode=node;
node.NextNode=FirstNode;
FirstNode=node;
}
return node;
}
public Node AddLast(object Value)
{
Node node=new Node(Value);
node.NextNode=null; // Sista noden har ingen nästa nod
if (LastNode==null) // Listan är tom
{
node.PreviousNode=null;
LastNode=node;
FirstNode=node;
}
else
{
LastNode.NextNode=node;
node.PreviousNode=LastNode;
LastNode=node;
}
return node;
}
}
}
Testkod
private void PrintList(LinkedList.LinkedList list)
{
LinkedList.Node n=list.FirstNode;
while (n!=null)
{
Console.WriteLine(n.ToString());
n=n.NextNode;
}
Console.WriteLine("---------------------");
}
private void button1_Click(object sender, System.EventArgs e)
{
LinkedList.LinkedList list=new LinkedList.LinkedList();
list.AddFirst("Per");
PrintList(list);
list.AddFirst("Joakim");
PrintList(list);
list.AddLast("Kalle");
PrintList(list);
list.AddFirst("Adam");
PrintList(list);
}