2012-01-19 3 views
6

Salut J'ai un tableau de chaînes, et j'ai besoin de les sortir du dernier au premier.Comment inverser un tableau

Je ne vois pas une fonction arrayReverse(), mais je suis juste apprendre ColdFusion

+2

CFLib à la rescousse! Quelqu'un a déjà écrit une fonction 'arrayReverse': http://www.cflib.org/udf/ArrayReverse – ale

Répondre

12

Vous pouvez juste boucle sur le tableau dans le sens inverse

<cfloop index="i" from="#arrayLen(myArray)#" to="1" step="-1"> 
    <cfoutput>#myArray[i]#</cfoutput> 
</cfloop> 

Je pense que vous avez besoin d'utiliser des méthodes Java pour vraiment inverser le tableau.

<cfscript> 
// and for those who use cfscript: 
for (var i = arrayLen(myArray); i >= 1; i--) { 
    writeOutput(myArray[i]); 
} 
</cfscript> 
+0

Si tout ce que vous faites est de sortir les valeurs, boucler en arrière dans le tableau comme ceci est ce dont vous avez besoin –

+3

La méthode java est rapide et facile également si vous avez accès à Java sur votre hôte: a = [1, 2, 3, 4, 5]; createObject ("java", "java.util.Collections"). Reverse (a); writeDump (a); Paul

1

Oh mais il existe une méthode ArraySort!

ArraySort(array, sort_type [, sort_order]);

retourne un booléen.

array est mis à jour par référence.

sort_type peut être numeric, text ou textnocase

sort_order peut être asc ou desc

<cfscript> 
test = [ "c", "d", "a", "b" ]; 
arraySort(test, 'textnocase'); 

test is now: 
[ "a", "b", "c", "d" ] 

</cfscript> 

Vérifiez la documentation ici:

https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arraysort.html

+1

Je sais qu'il dit arraySort, mais il demande comment inverser le tableau et ne pas le trier. Bonne solution, si le tableau original est trié, sinon cela ne fonctionnera pas. –

+1

Bien que ce type n'en ait pas besoin, [java.util.Collections] (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#reverse%28java.util .List% 29) fonctionne bien pour l'inversion – Leigh

0
<cfscript> 
    test = [ "a", "b", "c", "d" ]; 
    writeDump(listToArray(reverse(arrayToList(test)))); 
</cfscript> 

Fera l'affaire.

+1

Fine pour les petites baies - mais chère pour les grandes –

+3

Bonne idée si les données dans le tableau sont simples. Ne fonctionnerait pas si c'est un tableau d'objets ou de structures ou de tableaux. –

+0

Oui, cela ne fonctionnera que pour les types simples. – Paul

1

J'ai écrit cette fonction pour inverser un tableau. Il modifie le tableau et le renvoie.

function init(required array arr) { 
    var arrLen = arrayLen(arr); 
    for (var i = 1; i <= (arrLen/2); i++) { 
     var swap = arr[arrLen + 1 - i]; 
     arr[arrLen + 1 - i] = arr[i]; 
     arr[i] = swap; 
    } 
    return arr; 
} 

Je l'ai testé et il fonctionne sur les tableaux de chaînes, ainsi que des objets, etc.

writeOutput(arrayReverse(['a','b','c'])); // => ['c', 'b', 'a'] 

var a = ['apple', 'ball', 'cat', 'dog']; 
arrayReverse(a); 
writeOutput(a); // => ['dog', 'cat', 'ball', 'apple'] 

je l'ai mis dans son propre composant, il est donc plus facile à utiliser dans différents projets.

1

FYI tableau dans CF est juste un ArrayList, alors ...

arr = [1,2,3]; 
createObject("java", "java.util.Collections").reverse(arr); 
writeDump(arr); // arr becomes [3,2,1] 

Et je ne voudrais pas la peine d'écrire arrayReverse() parce tableau est passé par valeur CF (pas avant CF2016 de this.passArraybyReference) donc il est super inefficace.