βοηθεια σχετικα με λίστα (stringlist)

Συζητήσεις σχετικές με την Delphi και την πρόγονη της Pascal

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
crmaris
Δημοσιεύσεις: 17
Εγγραφή: 20 Δεκ 2004 23:46

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από crmaris » 08 Φεβ 2007 12:29

φτιάχνω ένα πρόγραμμα σε delphi 10 για να κάνω simulation μερικούς αλγόριθμους δρομολόγησης πακέτων σε ένα δίκτυο..

μέσα στο πρόγραμμα φτιάχνω μέσο της list.sort εντολής την παρακάτω λίστα..

0 1 110 100 100
0 3 94 100 100
0 4 55 100 100
0 5 90 100 100
1 2 148 100 100
1 4 105 100 100
........................
6 7 70 100 100

θέλω να κάνω sort την λίστα όχι μόνο ως προς την πρώτη στήλη αλλά και ως προς την τρίτη στήλη. Δοκίμασα πολλές μεθόδους customsort αλλα τίποτα..

Με ένα παράδειγα θέλω να κάνω το παρακάτω

0 4 55 100 100
0 5 90 100 100
0 3 94 100 100
0 1 110 100 100
1 4 105 100 100
1 2 148 100 100
........................

επίσης αφού κάνω το παραπάνω θέλω να αφαιρέσω από την λίστα τις γραμμές που είναι ίδιες ως προς την πρώτη στήλη αλλα έχουνε μεγαλύτερο αριιθμό στην τρίτη και να κρατήσω μόνο αυτήν με τον μικρότερο αριθμό.
Για να γίνω πιο κατανοητός την παραπάνω λίστα θέλω να την κάνω

0 4 55 100 100
1 4 105 100 100
......................

αν μπορεί να βοηθήσει κάποιος παιδιά θα με σώσει από το κόλημα που έχω φάει..

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από alkisg » 09 Φεβ 2007 07:03

Δεν βολεύει να κάνεις sort με strings. Παράδειγμα, το
10 2 148 100 100 θα ταξινομηθεί πριν από το
2 5 90 100 100.

Κάν' τους όλους αριθμούς πρώτα, ταξινόμησέ τους και αν θες στη συνέχεια ξανακάν' τους strings.

crmaris
Δημοσιεύσεις: 17
Εγγραφή: 20 Δεκ 2004 23:46

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από crmaris » 09 Φεβ 2007 09:58

το πρόβλημα είναι ότι στο συγκεκριμένο πρόγραμμα η κάθε σειρά strings αναπαριστά κάποιες ιδιότητες οι οποίες δεν πρέπει να μπερδευτούνε.. Το 10 2 148 100 100 με sort.list μπαίνει μετά το 2 5 90 100 100 (επιβεβαιωμένα γιατί το δοκίμασα στο πρόγραμμα μου). Με έχει προβληματίσει πολύ αυτό το πρόβλημα πάντος.. Σκέφτηκα να μετατρέψω την λίστα σε stringgrid και από εκεί να κάνω μετά sort σε συγκεκριμένα columns και μετά να την μετατρέψω ξανά σε stringlist.

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από alkisg » 09 Φεβ 2007 10:43

> Το 10 2 148 100 100 με sort.list μπαίνει μετά το 2 5 90 100 100
Για το καθένα από αυτά ΔΕΝ θες λίστα. Αρκεί ένα object (ή σκέτο record) με 5 integers.
Στη συνέχεια βάζεις όλα τα objects σε μία sortable list, και στο oncompare event συγκρίνεις πρώτο και τρίτο νούμερο.

crmaris
Δημοσιεύσεις: 17
Εγγραφή: 20 Δεκ 2004 23:46

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από crmaris » 09 Φεβ 2007 11:48

καταρχήν many thanks για την βοήθεια.. Παρακάτω το κομμάτι κώδικα που δημιουργεί την λίστα στο πρόγραμμά μου..

for k:=0 to nbrnodes-1 do connected[k]:=false; // mbrnodes τα nodes στο network
for i:=0 to graphlist.count-1 do
with graphlist, Tnode(objects) do
begin
if nbradjacents >0 then //nbradjacents γειτονικά nodes σε ένα node
for j:=0 to nbradjacents-1 do
with adjacents[j] do
begin
{MAKE LIST OF EDGE INFO BY WEIGHT or len,NODE1,NODE2,Energy node1,Energy node2}
n1:=fromnodeindex;
n2:=tonodeindex;
e1:=nodes_energy[n1];
e2:=nodes_energy[n2];
if n2<n1 then swap(n1,n2);

list.add(format('%2d%2d%4d%4d%4d',[n1,n2,len,e1,e2]));
//inc(totweight,weight);
inc(totlen,len);
end;
end;

list.Sort;


εγώ θέλω τα πάρω σαν αποτέλεσμα τα nodes 0,1,2,3 κτλ που έχουνε το μικρότερο len (απόσταση) με ένα από τα γειτονικά τους..

δηλαδή από τα παρακάτω

0 1 90 100 100
0 2 45 100 100
03 40 100 100

θέλω να κρατήσω μόνο το 0 3 40 100 100 και να σβήσω τα άλλα από την λίστα και ουτο καθεξης για τα nodes 1,2,3 κτλ..

Άβαταρ μέλους
alkisg
Δημοσιεύσεις: 265
Εγγραφή: 03 Ιουν 2005 11:53
Τοποθεσία: Ιωάννινα
Επικοινωνία:

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από alkisg » 09 Φεβ 2007 14:54

Στην περίπτωση αυτή το πρόβλημα είναι πιο απλό. Δε χρειάζεται καν ταξινόμηση κατά το τρίτο ψηφίο. Απλά θα κρατάς κάθε φορά το μικρότερο:
Π.χ. στην αρχή βάζεις το 0 2 45 100 100
Μετά όταν "βρεις" το 0 1 90 100 100, το συγκρίνεις με αυτό που ήδη έχεις και επειδή είναι μεγαλύτερο δεν το αντικαθιστάς.
Μετά όταν "βρεις" το 0 3 40 100 100, το συγκρίνεις με αυτό που έχεις (0 2 45 100 100) και επειδή είναι μικρότερο το αντικαθιστάς (=πετάς το παλιό).

Τώρα αν θες ντε και καλά να χρησιμοποιήσεις λίστα από strings, άλλαξε το φορμάτ ώστε
1) Όλοι οι αριθμοί να αποτελούνται από π.χ. 4 ψηφία, και
2) Η τρίτη στήλη να μπει δεύτερη (την ξανααλλάζεις αν χρειαστεί στη συνέχεια).
Έτσι το string σου θα έχει τη μορφή
0000 0090 0001 0100 0100
οπότε έτσι ΜΠΟΡΕΙΣ να κάνεις λεξικογραφικό sort.

crmaris
Δημοσιεύσεις: 17
Εγγραφή: 20 Δεκ 2004 23:46

βοηθεια σχετικα με λίστα (stringlist)

Δημοσίευση από crmaris » 09 Φεβ 2007 15:09

κατάλαβα αυτά που γράφεις και έχω δοκιμάσει κατι παρόμοιο. Βρήκα μια λύση τελικά και μόλις την τελειοποιήσω θα την postaro..

thanks και πάλι για την βοήθεια..

Απάντηση

Επιστροφή στο “Delphi, Pascal”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες