2009-05-17 7 views
2

Qu'est-ce qu'un moyen simple/efficace de combiner un ensemble de mots avec un espace intermédiaire, mais pas d'espace avant ou après?Espace d'impression après chaque mot

Je suppose qu'il est possible de supprimer l'espace après avoir tout combiné dans une boucle (quelque chose comme sum + = (term + "")) ... Je ne l'aime pas bien.

De préférence, codez en Java, Python ou Ruby.

Répondre

13

Eh bien, en Python, il sera facile à l'aide rejoindre:

values = ["this", "is", "your", "array"] 
result = " ".join(values) 
+2

Vous devriez éviter généralement en utilisant « str » comme nom de variable, car il est un type intégré. –

+0

Yup. Merci John de l'avoir signalé et merci à Carl pour l'avoir édité. –

1

Ce que vous voulez, c'est String.Join, mais puisque vous venez de dire que cela ne vous aidera probablement pas, voici quelques Join implementations in Java. Voici un string utility qui a une jointure pour Java.

-3

Il ne faut pas oublier le bon vieux

for s in strArray do 
    print s 
    print " " 
+5

Il ne veut pas un espace à la fin de la chaîne si ... – DeadHead

0

Eh bien, je sais que Python a une fonction comme celui-ci, et je suppose que Ruby fait, et Java. La fonction join prend un tableau de chaînes (en fonction de la langue, il peut être d'autres types) et les joint avec un caractère (ou une autre chaîne) que vous choisissez.

code Python:

wordString = " ".join(["word", "another", "word"]) 

Sinon, vous pouvez parcourir, le tableau, en ajoutant le mot et un espace, et tester si elle est le dernier élément. Si c'est le cas, ajoutez simplement le mot, et non l'espace.

code Python à nouveau: (grâce à PTBNL pour la suggestion)

wordArray = ["word", "another", "word"] 
wordString = "" 
for i in range(0, len(wordArray) - 1): 
    wordString += wordArray[i] + " " 
wordString += wordArray[len(wordArray) - 1] 
+1

merci pour le "" .join() mais le second fonctionne bien mais pas si élégant. – Devoted

+1

Pourquoi faire une boucle dans tout le tableau? Arrêtez-vous à l'avant-dernier élément, puis concattez le dernier élément en dehors de la boucle. Je pense que ce n'est pas moins élégant. En outre, cela permettra d'économiser du temps de traitement en éliminant la vérification if dans chaque passage de la boucle. – PTBNL

+0

Vrai ... Je vais éditer .. même si c'est un peu tard maintenant .. hein. – DeadHead

7

Oui, voici ce qui a été fait pour join. Voici la version Ruby:

["word", "another", "word"].join(" ") 

<flamebait> Comme vous pouvez le voir, Ruby fait join une méthode sur Array au lieu de String, et est donc beaucoup plus sensible. </flamebait>

+0

pourquoi cela est plus sensé ayant une jointure de chaîne me permet de rejoindre n'importe quel itérateur, mon propre implémenté au lieu d'ajouter join à chaque itérateur possible –

+5

Ce n'est pas plus "sensible"; ça a l'air plus "coutumier". En python, vous demandez au caractère espace de joindre les éléments de chaîne de l'argument itérable, qui n'a pas besoin d'être une liste. – tzot

+0

Oui, vous avez tous les deux raison. J'aime juste faire des jabs chez Python parfois :) Incidemment, dans Ruby, la méthode 'join' est en fait définie sur un module appelé' Enumerable'. N'importe quelle classe peut obtenir un comportement semblable à un tableau - y compris une méthode 'join' - en incluant' Enumerable'. Dans la bibliothèque standard, 'Array' et' Hash' incluent 'Enumerable' de cette façon. Donc, d'un point de vue Ruby, la manière Ruby est très raisonnable. –

1

droite d'un de mes classes de utilz existantes

C: \ java \ home \ src \ KRC \ utilz \ Arrayz.java

package krc.utilz; 

/** 
* A bunch of static helper methods for arrays of String's. 
* @See also krc.utilz.IntArrays for arrays of int's. 
*/ 
public abstract class Arrayz 
{ 
    /** 
    * Concetenates the values in the given array into a string, seperated by FS. 
    * @param FS String - Field Seperator - Name borrowed from awk 
    * @param Object[] a - array to be concatentated 
    * @return a string representation of the given array. 
    */ 
    public static String join(String FS, Object[] a) { 
    if (a==null||a.length==0) return ""; 
    StringBuilder result = new StringBuilder(String.valueOf(a[0])); 
    for(int i=1; i<a.length; i++) { 
     result.append(FS); 
     result.append(String.valueOf(a[i])); 
    } 
    return result.toString(); 
    } 

    .... 

} 

Vive. Keith


EDIT

Voici une comparaison des performances sale & rapide, en utilisant java.util.Arrays comme base de référence.

Notez que le coût du hotspot est amorti sur 100 itérations, et devrait être (plus ou moins) le même pour les trois techniques ... krc.utilz.RandomString et krc.utilz.Arrayz sont tous deux disponibles sur demande, il suffit de demander .

package forums; 

import java.util.Arrays; 
import krc.utilz.Arrayz; 
import krc.utilz.RandomString; 

class ArrayToStringPerformanceTest 
{ 
    private static final int NS2MS = 1000000; // 1 millisecond (1/10^3) = 1,000,000 nanoseconds (1/10^9) 

    public static void main(String[] args) { 
    try { 
     String[] array = randomStrings(100*1000, 16); 
     long start, stop; 
     String result; 

     final int TIMES = 100; 
     long time1=0L, time2=0L, time3=0L; 

     for (int i=0; i<TIMES; i++) { 

     start = System.nanoTime(); 
     result = Arrays.toString(array); 
     stop = System.nanoTime(); 
     //System.out.println("Arrays.toString took "+(stop-start)+" ns"); 
     time1 += (stop-start); 

     start = System.nanoTime(); 
     result = Arrayz.join(", ", array); 
     stop = System.nanoTime(); 
     //System.out.println("Arrayz.join  took "+(stop-start)+" ns"); 
     time2 += (stop-start); 

     start = System.nanoTime(); 
     result = arrayToString(array, ", "); 
     stop = System.nanoTime(); 
     //System.out.println("arrayToString took "+(stop-start)+" ns"); 
     time3 += (stop-start); 

     } 
     System.out.format("java.util.Arrays.toString took "+(time1/TIMES/NS2MS)+" ms"); 
     System.out.format("krc.utilz.Arrayz.join  took "+(time2/TIMES/NS2MS)+" ms"); 
     System.out.format("arrayToString    took "+(time3/TIMES/NS2MS)+" ms"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    public static String arrayToString(String[] array, String spacer) { 
    StringBuffer result = new StringBuffer(); 
    for (int i=0; i<array.length; i++) { 
     result.append(array[i] + ((i+1<array.length)?spacer:"")); 
    } 
    return result.toString(); 
    } 

    private static String[] randomStrings(int howMany, int length) { 
    RandomString random = new RandomString(); 
    String[] a = new String[howMany]; 
    for (int i=0; i<howMany; i++) { 
     a[i] = random.nextString(length); 
    } 
    return a; 
    } 

} 

/* 
C:\Java\home\src\forums>"C:\Program Files\Java\jdk1.6.0_12\bin\java.exe" -Xms512m -Xmx1536m -enableassertions -cp C:\Java\home\classes forums.ArrayToStringPerformanceTest 

java.util.Arrays.toString took 26 ms 
krc.utilz.Arrayz.join  took 32 ms 
arrayToString    took 59 ms 
*/ 

Voir aussi la suggestion de Doomspork, et mon commentaire à ce sujet.

Cheers. Keith

1

Java pourrait être accompli avec quelque chose comme ceci:

public static String arrayToString(String[] array, String spacer) { 
    StringBuffer result = new StringBuffer(); 
    for(int i = 0 ; i < array.length ; i++) { 
     result.append(array[i] + ((i + 1 < array.length) ? spacer : "")); 
    } 
    return result.toString(); 
} 
+1

Quelques remarques avec le code: (1) Faire "spacer" le premier argument s'adresse à varargs. (2) StringBuilder est un peu plus rapide que StringBuffer parce que StringBuilder n'a aucun surcoût de synchronisation (c'est-à-dire qu'il n'est pas sécurisé pour les threads). (3) Le code "a [i] + quelquechose" crée un nouvel objet StringBuilder (StringBuffer pre-1.5) à chaque fois à travers cette boucle. Plus d'ordures signifie une application plus lente. (4) Il n'est pas nécessaire d'évaluer "est-ce le dernier" à chaque fois dans la boucle. Faites-le une fois, avant la première ou après la dernière. (5) Voir http://en.wikipedia.org/wiki/Schlemiel_the_painter%27s_Algorithm Keith ;-) – corlettk

+0

Bonne réaction, même si je n'ai pas la moindre idée de ce qu'est un niggle. :) Je n'étais pas au courant des avantages de StringBuilder, merci pour les heads up! – doomspork

0

En Python, demandez-vous la rejoindre la chaîne-join une itérables de cordes:

alist= ["array", "of", "strings"] 
output= " ".join(alist) 

Si cette notation semble bizarre vous, vous pouvez faire la même chose dans une syntaxe différente:

output= str.join(" ", alist) 

Ceci fonctionne pour n'importe quel itérable (listes, tuples, dictionnaires, générateurs, expressions de générateur ...), tant que les articles sont toutes les chaînes (ou chaînes d'Unicode).

Vous pouvez remplacer unicode pour str (ou u' ' pour ' ') si vous voulez un résultat unicode.

1

Cela fonctionne en Ruby ainsi:

['a', 'list', 'of', 'words'] * " " 
Questions connexes