7
votes

Quelles sont les façons intelligentes de produire une liste des n items avec des séparateurs (N-1) entre -batween?

Disons que nous avons un tableau avec n elements (n> 0).

Nous souhaitons produire une liste de ces éléments, avec un séparateur entre eux. P>

une approche commune de Ce problème est: p> xxx pré>

mais il semble un peu désordonné de devoir faire cela. P>

Une autre approche serait la suivante: p>

check that there is at least one element
loop
  (
     output element
     next element, or break if no more elements
     output separator
  )


6 commentaires

Je n'ai trouvé aucun dupliqué, mais il pourrait y avoir. Les termes de recherche ne sont pas faciles à trouver.


C'est plutôt une question de mise en œuvre qu'une question d'algorithme.


Vrai. J'ai ajouté la balise, merci.


Je doute que tout peut battre votre deuxième approche.


wiki selon la demande de @ Benoit.


Dupliqué possible de Listes d'impression avec les virgules C ++


11 Réponses :


11
votes
for (i = 0; i < n; ++i) switch(i) {
    default: output_separator();
    case 0: output_item(i);
}
or variations on this. I can't really think of how else not to repeat output_item(i).

6 commentaires

Manquant un cas avant que 0


Cela ressemble à une sortie 0, puis de séparateurs N-1.


@Geoffrey - in c, commutateur a implicitement castthrough. Vous devez spécifiquement BREAK pour éviter les cas de réussite.


Akin aussi, mais moins violant que le périphérique de Duff ( fr.wikipedia.org/wiki/duff%27s_device ). Paraphrasant, cela mérite un vote, mais je ne suis pas sûr de savoir si jusqu'à ce que jetais ou que je suis allé avec jusqu'à).


@Lijie - Je n'ai totalement pas simplement écrit une version générique de ceci qui prend un pointeur sur une fonction d'impression et un vide * . Et deux taille_t s pour la longueur de la matrice et la taille de l'élément.


@Chris: Ce serait un exercice totalement instructif :)



1
votes
for i in items.length-1; do
   output item; output separator
output last item

0 commentaires

5
votes

Parfois: xxx

est plus court.


0 commentaires

2
votes

J'utilise toujours le premier article Cochez l'idiome. Voici le code en Java:

List<Object> list;
if (list.size() > 0) {
   put(list.get(0));
}
for(int i = 1; i < list.size(); i++) {
   putSeparator();
   put(list.get(i));                                
}


0 commentaires

16
votes
char *sep = "";
for (i = 0; i < size; ++i) {
    printf("%s%s", sep, item[i]);
    sep = ", ";
}

0 commentaires

5
votes

Comme il est marqué comme langue-agnostique, je pense qu'il est important de souligner que certaines langues ont des fonctionnalités intégrées pour vous épargner de même de penser à ce problème. Prenez ce code Python par exemple: xxx


4 commentaires

Je pense que sa question s'apparente à la mise en œuvre de la méthode de la jointure.


@Geoffrey: Je ne suis pas d'accord, c'est une langue agnostique afin que la solution de jointure ne soit pas seulement incluse mais surlignée. Je ne peux pas vous dire à quelle fréquence je vois des débutants à des langues de haut niveau essayer de faire la chose à utiliser sans se rendre compte que la jointure est la bonne façon de le faire. Je le faisais moi-même.


Oh au fait, dans TCL, ce serait: met [jointure $ list ","] et je suppose que JavaScript pourrait être: console.log (array.join (","))


Objective-C: [Composants de tableauJoingBystring: @ ","]



1
votes

En commun Lisp, il est limitant sur simple, tant que vous pouvez coder le séparateur.

(defun return-delimited-list (list &optional stream)
  (format stream "~{~A~^, ~}" list))


0 commentaires

5
votes

une solution possible C ++:

http://groups.google.com/group /comp.lang.chan++/msg/a746a588cedfa44b

Résumé: Écrivez un infix_ostream_itéator , qui est fondamentalement identique à ostream_iterator sauf que Le paramètre "Séparateur" est vraiment un séparateur, pas un suffixe à chaque article. L'utilisation serait alors: xxx


0 commentaires

3
votes

Cette version évite toute branche supplémentaire: xxx

(pour ceux qui ont peur de goto , il peut être écrit à l'aide de l'approche de l'appareil de Duff's)


2 commentaires

+2 Pour mentionner le périphérique de Duff, -1 pour n'utiliser pas le commutateur :)


@diebuddha L'interrupteur doit être à l'extérieur de la boucle, pas à l'intérieur de l'exemple de Lijie. Si vous pensez que c'est mieux qu'un goto, n'hésitez pas à l'utiliser :) Lecture intéressante: chiark.greenend.org.uk/~sgtatham/coroutines.html



5
votes

Pour le meilleur ou le pire, j'utilise des boucles comptées, avec xxx

Je suis sûr que c'est un appât bownvote pour être démodé, mais cela fonctionne.

Si quelqu'un veut me dire que c'est inefficace, garçon, j'ai une flamme prête à la flamme; -)


2 commentaires

Il n'y a aucune raison de descendre une solution de travail. Je suppose avec des itérateurs qu'il devient si (i! = MyContainer.begin ()) ?


+1. Absolument clair. À quiconque avancé: prédicteurs des succursales.



3
votes

Le "premier chèque" idiome dans HASKELLL:

*Main> intersperse "," [1,2,3]
"1,2,3"
*Main> intersperse "," [1]
"1"
*Main> intersperse ";" [1,2]
"1;2"
*Main> intersperse "," []
""


0 commentaires