Gehen Sie Sortieren eine Scheibe Runen?

Ich habe Probleme beim Sortieren von Zeichenfolgen, die durch Zeichen (um zu überprüfen, ob zwei strings sind anagramme, ich möchte sozusagen beide von Ihnen, und überprüfen Sie für Gleichheit).

Bekomme ich eine []rune Darstellung der Zeichenfolge s wie diese:

runes := make([]rune, len(s)) 
copy(runes, []rune(s))

Und ich kann Sortieren von int-Werten, wie dies

someInts := []int{5, 2, 6, 3, 1, 4} //unsorted
sort.Ints(someInts)

Aber rune ist nur ein alias für int32 so ich sollte in der Lage sein zu rufen

sort.Ints(runes) 

Jedoch bekomme ich die Fehlermeldung:

cannot use runes (type []rune) as type []int in function argument

So... wie Sortiere ich eine Scheibe int32, int64 oder int*?

BEARBEITEN: ich habe meine Runen sortiert, aber junge, das ist hässlich.

type RuneSlice []rune

func (p RuneSlice) Len() int           { return len(p) }
func (p RuneSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p RuneSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }

func sorted(s string) string {
    runes := []rune(s)
    sort.Sort(RuneSlice(runes))
    return string(runes)
}

Also im Grunde, wenn Sie haben ein Stück von was auch immer, müssen Sie wickeln Sie es in einer Art, die sort.Interface. Alle diese Implementierungen haben genau die gleiche Methode, die Körper (wie sort.IntSlice und sort.Float64Slice). Wenn das wirklich ist, wie hässlich diese sein muss, warum dann nicht Sie bieten diese WhateverSlice-Wrapper in der sort Paket? Das fehlen von Generika weh sehr schlecht jetzt. Es muss einen besseren Weg zur Sortierung Dinge.

  • Ja, es ist eine schreckliche Verletzung der TROCKEN. Ich meine, mit der exakt gleichen code repliziert, so oft als es gibt grundlegende Arten ist ziemlich schlecht. Generisches Sortieren algorithmen, die Arbeit auf die grundlegenden Typen ohne zusätzliche Nähte ist ziemlich viel, was Sie erwarten, in JEDER Sprache. Aber mit lehren der compiler, wie man die Länge eines slice-20 Male ist einfach unglaublich.
  • Sie fehlt der Punkt komplett. Der generische Sortieralgorithmus funktioniert nicht nur für Scheiben, sondern für alles befriedigende sort.Interface. Nun, wie Sie vorschlagen, um automatisch bekommen die Len Freunde und alles, was Sie wissen nichts über, im Voraus (zur compile-Zeit)??? IOW, Ihr schimpfen ist nicht rational.
  • Ich erwarte nicht, dass der compiler in der Lage sein Sortieren BucketOfFish Instanzen aus der box. sort.Interface scheint wie eine schöne Abstraktion für diese Fälle (auch wenn ich Sie wahrscheinlich wollen, um meine Fische in Scheiben als auch, anstelle von einigen custom-container). Ich finde es einfach seltsam, dass ein so elementarer Anwendungsfall (slice of a basic type), fallen nicht unter die standard-Bibliothek.
  • Ihre make - Anweisung verwenden soll utf8.RuneCountInString (aus unicode/utf8) eher als len; len zählt die Anzahl der bytes an, nicht die Anzahl der Runen.
  • Eigentlich typecasting funktioniert auch! len([]rune(classextender)) liefert das gleiche wie utf-8.RuneCountString (weniger Importe), aber für ein anagram solver-es wird nicht egal, in 99% der Fälle. Eine colision wo alle utf8 Zeichen die bytes identisch sind ist sehr unwahrscheinlich (aber möglich).
InformationsquelleAutor andras | 2013-08-11
Schreibe einen Kommentar