3 Stimmen

Sortierung des Alphabets in Perl neu ordnen

Ich versuche, die Sortierung im armenischen Alphabet zu verbessern, da alle Standard-Unix-Tools und Programmiersprachen Buchstaben und Wörter nur für einen der beiden Hauptdialekte (westlich) sortieren.

Das technische Problem besteht darin, eines der Zeichen neu zu ordnen " ", um es an eine andere Stelle unter den Buchstaben zu setzen, sagen wir, um es zum letzten Zeichen zu machen, damit die Wörter für den Ordnungsdialekt (Ost) richtig geordnet sind. Sprachlich gesehen ist im östlichen Dialekt dieses " "Das Symbol wird nicht "allein" geschrieben, sondern ist ein Teil eines Briefes, der mit 2 Zeichen geschrieben wird. ". Die aktuelle Sortierung setzt den Buchstaben " " hinter "" oder "" 2-Buchstaben-Konstruktionen.

Im Grunde sollte es ganz ähnlich sein, wenn man z. B. den Buchstaben "v" an die Stelle des Buchstabens "z" im lateinischen Alphabet setzen wollte.

Ich versuche, etwas zu verwenden wie

#!/usr/bin/perl -w
use strict;

my (@sortd, @unsortd, $char_u, $char_x);
#@unsortd = qw(      );
@unsortd = qw(   );

@sortd = sort {
  $char_u = "";
  $char_x = split(//, @unsortd);
  if ($char_u gt $char_x) {
    1;
  } else {
    return $a cmp $b;
  } 
} @unsortd;

print "@sortd\n";

aber das gilt nicht für ganze Wörter, nur 2-Buchstaben-Formen sind festgelegt.

UPDATE: Ich konnte das Problem lösen, indem ich tr Funktion zur Zuordnung von Buchstaben zu Zahlen, wie in Perlmonke

12voto

Mat Punkte 195740

Sie sollten einen Blick auf die Unicode::Collate::Locale Modul, falls Sie dies nicht bereits getan haben.

use Unicode::Collate::Locale;

my $collator = Unicode::Collate::Locale->new(locale => "hy");
@sortd = $collator->sort(@unsortd);
print join("\n", @sortd, '');

Dies wird gedruckt:

(Ich bin nicht sicher, ob dies die Ausgabe ist, die Sie erwarten, aber dieses Modul und Unicode::Collate enthält ziemlich viele Informationen, so dass es einfacher sein könnte, eine benutzerdefinierte Zusammenstellung für Ihre Bedürfnisse auf dieser Grundlage zu erstellen, als eine eigene zu erstellen).

-1voto

Itamar Punkte 2053

Für Standardalphabete Unicode::Collate::Locale wie von @mat vorgeschlagen, sollte die erste Wahl sein.

Andererseits kann "index" wie folgt verwendet werden, wenn Sie sehr spezifische Bedürfnisse haben. Um einzelne Zeichen zu sortieren (beachten Sie, dass fehlende Zeichen an erster Stelle stehen würden):

my $alphabet_A = "acb";
sub by_A {index($alphabet_A,$a) <=> index($alphabet_A,$b)};

...

my @sorted = sort by_A @unsorted;

Zum Beispiel kann man eine Schleife in die Definition von by_A einbauen. Damit das Folgende funktioniert, definieren Sie die Funktion min() und nehmen eine Feinabstimmung für den Fall von Wörtern unterschiedlicher Länge vor:

sub by_A {
    $flag=0;
    foreach my $i (0..min(length($a),length($b))-1) { 
        return ($flag) if ($flag);
        $flag = ($flag or 
                 index($alphabet_A,substr($a,$i,1)) <=> index($alphabet_A,substr($b,$i,1)));
    }
    return $flag;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X