2009-05-17 71 views
2

什麼是一個簡單/有效的方式來組合一個單詞的數組與一個空格之間,但沒有空間之前或之後?每個單詞之後的打印空間

我想可能在將所有內容合併到一個循環(類似於sum + =(term +「」))之後刪除空格......我不喜歡它。

最好在Java,Python或Ruby中編寫代碼。

回答

13

那麼,在Python會使用是直接加入

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

通常你應該避免使用「STR」作爲變量名,因爲它是一個內置的類型。 – 2009-05-17 23:48:18

+0

是的。感謝John指出了這一點,並感謝Carl對其進行編輯。 – 2009-05-18 13:37:50

-3

讓我們不要忘記好了老式

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

雖然... – DeadHead 2009-05-17 02:51:43

0

嗯,我知道Python有這樣的函數,我假設Ruby和Java。

連接函數接受一串字符串(取決於語言,它可以是其他類型),並將它們與您選擇的字符(或另一個字符串)結合在一起。

Python代碼:

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

否則,您可以通過,數組循環,增加的字和一個空格,測試,如果它是最後一個元素。如果是這樣,只需添加單詞,而不是空格。

的Python代碼再次:​​(感謝PTBNL您的建議)

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

感謝您的「」.join()但他不想在字符串的末尾有一個空格,但第二個工作正常,但沒有那麼優雅。 – Devoted 2009-05-17 03:18:04

+1

爲什麼要遍歷整個數組?停在最後一個元素旁邊,然後連接循環外的最後一個元素。我認爲這是優雅的。此外,通過消除循環的每次通過中的if檢查來節省處理時間。 – PTBNL 2009-05-17 03:52:00

+0

真的......我會編輯..即使現在晚了一點.. ..呃。 – DeadHead 2009-05-17 06:29:38

7

是的,這就是join被造的。這裏是Ruby版本:

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

<flamebait>正如你所看到的,紅寶石使得join的方法上Array而不是String,因此是更爲明智。 </flamebait>

+0

爲什麼這樣更明智 加入字符串允許我加入任何迭代器,我自己實現的一個,而不是向每個可能的迭代器添加連接 – 2009-05-17 06:05:52

+5

這不是更「明智」;它只是看起來更「習慣」。在python中,你要求空格字符加入迭代參數的字符串元素,這不需要是一個列表。 – tzot 2009-05-17 08:09:35

+0

是的,你是對的。我只是喜歡在Python中做一些刺探:) 順便提一句,在Ruby中,join方法實際上是在名爲Enumerable的模塊上定義的。任何類都可以通過包含'Enumerable'來獲得類似數組的行爲 - 包括'join'方法。在標準庫中'Array'和'Hash'都包含'Enumerable'。 所以從Ruby的角度來看,Ruby方式非常明智。 – 2009-05-17 19:27:09

1

直接從我現有的utilz類

的C之一:\ java的\家裏的\ 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(); 
    } 

    .... 

} 

乾杯。基思。


編輯

這裏有一個快速&骯髒的性能比較,使用java.util.Arrays中作爲基準。

請注意,熱點成本是分攤超過100次迭代,並應該(或多或少)相同的所有三種技術... krc.utilz.RandomString和krc.utilz.Arrayz都可以根據要求,只要問。

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 
*/ 

請參閱Doomspork的建議和我的評論。

乾杯。基思。

1

Java原本像這樣的東西來完成:

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

一些小竅門與代碼: (1)使「spacer」第一個參數迎合可變參數。 (2)StringBuilder比StringBuffer快一點,因爲StringBuilder沒有任何同步開銷(即它不是線程安全的)。 (3)代碼「a [i] + whatever」每次通過該循環創建一個新的StringBuilder對象(StringBuffer pre-1.5)。垃圾越多意味着應用程序越慢。 (4)每次通過循環都沒有必要評價「這是最後一個」。在第一次或最後一次之前做一次。 (5)見http://en.wikipedia.org/wiki/Schlemiel_the_painter%27s_Algorithm Keith ;-) – corlettk 2009-05-17 04:26:32

+0

良好的反饋,雖然我沒有絲毫的想法是一個微妙的。 :)我沒有意識到StringBuilder的優點,感謝您的高舉! – doomspork 2009-05-18 11:19:22

0

在Python,你問連接字符串join字符串迭代:

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

如果這個符號似乎怪異你可以用不同的語法做同樣的事情:

output= str.join(" ", alist) 

這適用於任何可迭代的(列表,元組,字典,生成器,生成器表達式...),只要項目都是字符串(或unicode字符串)。

如果您需要unicode結果,您可以用unicode代替str(或u' '代替' ')。

1

這將在Ruby的工作,以及:

['a', 'list', 'of', 'words'] * " " 
相關問題