Печать пробела после каждого слова - PullRequest
2 голосов
/ 17 мая 2009

Что такое простой / эффективный способ объединить массив слов вместе с пробелом между ними, но без пробела до или после?

Полагаю, можно удалить пробел после объединения всего в цикле (что-то вроде sum + = (term + "")) ... хотя мне это не нравится.

Предпочтительно код на Java, Python или Ruby.

Ответы [ 9 ]

13 голосов
/ 17 мая 2009

Что ж, в Python будет просто использовать join :

values = ["this", "is", "your", "array"]
result = " ".join(values)
7 голосов
/ 17 мая 2009

Да, для этого и была создана join. Вот версия Ruby:

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

<flamebait> Как видите, Ruby делает join методом для Array вместо String, и, таким образом, гораздо более разумным. </flamebait>

1 голос
/ 17 мая 2009

Это будет работать и в Ruby:

['a', 'list', 'of', 'words'] * " "
1 голос
/ 17 мая 2009

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 голос
/ 17 мая 2009

Прямо из одного из моих существующих классов утилит

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();
  }

  ....

}

Приветствия. Кит.


EDIT

Вот быстрое и грязное сравнение производительности с использованием 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 голос
/ 17 мая 2009

Что вам нужно, так это String.Join, но поскольку просто сказать, что это, вероятно, вам не поможет, вот некоторые реализации Join в Java . Вот строковая утилита , которая имеет соединение для Java.

0 голосов
/ 17 мая 2009

В Python вы запрашиваете у строки соединения до объединения итерируемой строки:

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

Если эта запись кажется вам странной, вы можете сделать то же самое в другом синтаксисе:

output= str.join(" ", alist)

Это работает для любых итераций (списков, кортежей, словарей, генераторов, выражений генераторов ...), если все элементы являются строками (или строками Юникода).

Вы можете заменить unicode на str (или u' ' на ' '), если хотите получить результат в Unicode.

0 голосов
/ 17 мая 2009

Ну, я знаю, что в Python есть такая функция, и я предполагаю, что в Ruby есть и Java.

Функция join принимает массив строк (в зависимости от языка, это могут быть другие типы) и объединяет их вместе с выбранным символом (или другой строкой).

Код 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]
0 голосов
/ 17 мая 2009

Давайте не забудем старомодные добрые

 for s in strArray do
     print s
     print " "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...