Frage: Array sortieren per Userreading-Funktion

Begonnen von All-Ex, 22 April 2018, 21:06:32

Vorheriges Thema - Nächstes Thema

All-Ex

Hallo,

ich habe im HTTPMOD Modul ein Reading erzeugt, das so ausschaut:

Zitat[["18","Gravensteiner-Platz","0"],["18","Lokalbahnhof","2"],["34","Mönchhofstraße","5"],["83","Lohrberg","3"],["34","Bornheim Mitte","5"],["18","Gravensteiner-Platz","17"],["34","Bornheim Mitte","15"],["18","Lokalbahnhof","17"],["30","Bad Vilbel Bahnhof","18"],["34","Mönchhofstraße","19"],["18","Gravensteiner-Platz","29"],["34","Bornheim Mitte","30"],["18","Lokalbahnhof","32"],["83","Lohrberg","33"]]

(Das sind Buslinien einer Haltestelle mit Ziel und der Abfahrtszeit in Minuten)

Diesen String möchte ich nach der 3. Spalte (Abfahrtszeit) aufsteigend sortieren. (Z.B. ist die 83 zum Lohrberg im String oben zu weit hinten und müsste um eine Position nach vorne). Kann ich das über eine Userreading-Funktion machen?

Danke für alle Tips,
Alex

KernSani

sicherlich kriegst du das irgendwie im userreading hin, ich würde aber empfehlen, das in 99_myUtils auszulagern
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

mumpitzstuff


my %hash = ();
my $result = '[';
while ($reading =~ /(\[".+?"([^"]+)"\])/g)
{
  $hash{$2} = $1;
}
for my $key (sort {$a<=>$b} keys %hash)
{
  $result .= $hash{$key};
}
$result .= ']';


So vielleicht in etwa. Der erste Part parsed den String in ein Hash und verwendet dabei jeweils die dritte Spalte als Key. Dann wird der hash nach den keys sortiert und wieder zurück ins result geschrieben.

Ist nur schnell runter geschrieben bzw. zusammen kopiert. Sind bestimmt noch irgendwo Bugs drin...

All-Ex

Danke Dir!

Der Code funktioniert schon mal mit dem Beispiel-String :-) Wenn es aber 2 gleiche Werte bei der Abfahrtszeit (3. Spalte) gibt, wird eine Verbindung gelöscht (hash kennt ja keine doppelten Keys).

Ich schau mal ob ich es auf ein Array umgebaut kriege...

Alex

mumpitzstuff

my %hash = ();
my $result = '[';
while ($reading =~ /(\[".+?"([^"]+)"\])/g)
{
  $hash{$1} = $2;
}
for my $key (sort {$hash{$a}<=>$hash{$b}} keys(%hash))
{
  $result .= $key;
}
$result .= ']';

All-Ex

Gute Idee, das einfach rumzudrehen  :) Funktioniert jetzt!

Danke,
Alex