Comment puis-je inverser un tableau en Aller?
http://play.golang.org/p/W70J4GU7nA
s := []int{5, 2, 6, 3, 1, 4}
sort.Reverse(sort.IntSlice(s))
fmt.Println(s)
//5, 2, 6, 3, 1, 4
Il est difficile de comprendre ce que cela signifie en func Inverse(data Interface).
Comment puis-je inverser un tableau? Je n'ai pas besoin de trier.
- Voir stackoverflow.com/questions/18343208/.... Je pense que vous devez utiliser
Sort
le faire facilement.
Vous devez vous connecter pour publier un commentaire.
Normalement, pour trier un tableau d'entiers vous envelopper dans une
IntSlice
, qui définit les méthodesLen
,Less
, etSwap
. Ces méthodes sont à leur tour utilisés parsort.Sort
. Cesort.Reverse
n'est qu'il faut un type existant qui définitLen
,Less
, etSwap
, mais il remplace leLess
méthode avec un nouveau qui est toujours l'inverse de la sous-jacentesLess
:Donc, lorsque vous écrivez
sort.Reverse(sort.IntSlice(s))
, ce qui se passe, c'est que vous êtes l'obtention de cette nouvelle, 'modified'IntSlice
qui a il estLess
méthode remplacé. Donc, si vous appelezsort.Sort
sur elle, qui appelleLess
, il sera triée dans l'ordre décroissant.Honnêtement, c'est assez simple pour que je venais de l'écrire comme ceci:
http://play.golang.org/p/vkJg_D1yUb
(Les autres réponses font un bon travail en expliquant
Interface
et comment l'utiliser; donc, je ne vais pas le répéter.)Je suis à 2 ans de retard, mais juste pour le plaisir et intérêt que je voudrais contribuer à une "saugrenue" de la solution.
En supposant que la tâche est vraiment inverser une liste, puis pour les performances brutes bgp's solution est probablement imbattable. Il fait le travail tout simplement et efficacement par le remplacement des éléments de tableau de l'avant à l'arrière, une opération qui est efficace dans la ram de la structure des tables et les tranches.
Dans les langages de Programmation Fonctionnelle, la idiomatiques approche serait impliquent souvent la récursivité. Cela semble un peu étrange au départ, ont atroce de la performance. Cela dit, voici une récursif tableau d'inversion de la fonction (dans un petit programme de test):
De sortie:
Encore une fois, c'est pour le plaisir et non de production. Non seulement c'est lent, mais il est en dépassement de capacité de la pile si la liste est trop grande. Je viens de tester, et il va inverser une liste de 1 million de
int
s mais se bloque sur 10 millions de dollars.Tout d'abord, si vous voulez inverser la matrice, il faut faire ça,
Puis, regardez à l'utilisation de l'Inverse dans golang.org
Et de regarder la description de l'inversion et de Tri
Donc, comme vous le savez, le Tri n'est pas seulement un algorithme de tri, vous pouvez l'afficher comme une usine, lorsque vous utilisez l'Inverse, il suffit de renvoyer un inversée algorithme de tri, le Tri est juste de faire le tri.
Si vous voulez inverser la matrice, vous pouvez simplement aller à travers elle dans l'ordre inverse. Depuis il n'y a pas de "reverse gamme" primitive dans la langue (du moins pas encore), vous devez faire quelque chose comme ceci (http://play.golang.org/p/AhvAfMjs_7):
Quant à savoir si il est difficile de comprendre ce
sort.Reverse(data Interface) Interface
fait, je pensais la même chose jusqu'à ce que j'ai vu dans le code source de "http://golang.org/src/pkg/sort/sort.go".Il fait juste les comparaisons nécessaires pour le tri à être "l'autre sens".
C'est plus générique tranche fonction d'inversion. Il va paniquer si l'entrée n'est pas une tranche.
Cela signifie qu'il faut un
sort.Interface
et renvoie une autresort.Interface
-- il ne fait pas le tri lui-même. Par exemple, si vous passez danssort.IntSlice
(qui est essentiellement un[]int
qui peut être transmis àsort.Sort
de faire le tri dans l'ordre croissant), vous aurez une nouvellesort.Interface
qui trie les entiers dans l'ordre décroissant à la place.Par ailleurs, si vous cliquez sur le nom de la fonction dans la documentation, il relie directement à la source pour
Reverse
. Comme vous pouvez le voir, c'est juste enveloppe lesort.Interface
que vous passez, alors la valeur retournée parReverse
obtient toutes les méthodes de l'originalsort.Interface
. La seule méthode qui est différente, c'est leLess
méthode qui renvoie l'inverse de laLess
méthode sur l'embeddedsort.Interface
. Voir cette partie de la langue spec pour plus de détails sur les champs.Ici est une autre façon de faire
https://play.golang.org/p/-tIzPX2Ds9z
sort.SliceStable
alors votre tableau devient inversée. La réponse devrait être mis à jour pour utilisersort.SliceStable
Ici est un simple Aller-solution qui utilise un système efficace (pas de mémoire supplémentaire) approche inverse d'une matrice:
L'idée est que l'inversion d'une matrice est équivalente à l'échange de chaque élément avec son image dans un miroir à travers le centre.
https://play.golang.org/p/kLFpom4LH0g
À l'inverse d'une matrice en place, accéder à mi-parcours, et de swap de chaque élément avec son "jeu de miroir":
https://play.golang.org/p/JeSApt80_k
Voici ma solution pour inverser un tableau:
Vous pouvez essayer cette solution sur la route de l'aire de jeux la aller de l'aire de jeux
Ne pas l'inverser, laissez le comme ça maintenant, et puis il suffit de le parcourir à l'envers.