Присоединиться к запятой, если не пустой или пустой

Я видел этот ответ о том, как связать String [] с разделенной запятой строкой.

Однако мне нужно, чтобы утилита присоединялась к строке в массиве только, если значения не пусты.

Каков наилучший способ сделать это? без циклизации до удаления String []. Я предпочитаю один метод, который делает оба.

EDITED

например:

I, love, , u

будет:

 I love u

Ответ 1

public class So20111214a {
    public static String join(String[] argStrings) {
        if (argStrings == null) {
            return "";
        }
        String ret = "";
        if (argStrings.length > 0) {
            ret = argStrings[0];
        } // if
        for (int i = 1; i<argStrings.length; i++) {
            ret += (argStrings[i] == null) 
                    ? "" 
                    : (argStrings[i].isEmpty() 
                        ? "" 
                        :  ( "," + argStrings[i] ) );
        } // for
        return ret;
    } // join() method

    public static void main(String[] args) {
        String[] grandmasters = {  
            "Emanuel Lasker", 
            "José Raúl Capablanca", 
            "Alexander Alekhine", 
            "Siegbert Tarrasch", 
            "Frank Marshall"  
        };
        String[] s1 = null;
        String[] s2 = {};
        String[] s3 = { "Mikhail Botvinnik" };
        System.out.println(join(s1));
        System.out.println(join(s2));
        System.out.println(join(s3));
        System.out.println(join(grandmasters));
        System.out.println(join(new String[]{"I", "love", "", null, "u!"}));
    } // main() method

    /* output:
    <empty string>
    <empty string>
    Mikhail Botvinnik
    Emanuel Lasker,José Raúl Capablanca,Alexander Alekhine,Siegbert Tarrasch,Frank Marshall
    I,love,u!
    */

} // So20111214a class

PS: Извините за использование? оператор - я должен был сделать это быстро, я на работе.:)

Ответ 2

В Java 8 вы можете использовать Stream:

    List<String> list = Arrays.asList("I", " ", "love", null, "you");
    String message = list.stream().filter(StringUtils::isNotBlank)
                     .collect(Collectors.joining(", "));
    System.out.println("message = " + message);

Ответ 3

Почему не просто цикл в массиве и используется StringBuilder для создания строки с разделителями-запятыми только для не нулевых значений.

Ответ 4

Любая проблема с проверкой для null/empty?

String[] values = ?;
if (values != null && values.length > 0) {
  // join
}

Ответ, на который вы указали, уже делает соединение, используя StringUtils.join

Ваше требование не совсем соответствует этому, но это так просто, что лучше всего реализовать собственный цикл соединения, например.

    StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (String word: words) {
        if (word != null && (word = word.trim()).length() > 0) {
            if (first) {
                first = false;
            } else {
                sb.append(',');
            }
            sb.append(word);
        }
    }

Ответ 5

Без API или библиотеки мы могли бы присоединиться к непустому, но не нулевому массиву строк следующим образом:

Пользовательский метод:

public String joinNonBlankStringArray(String s[], String separator) {
    StringBuilder sb = new StringBuilder();
    if (s != null && s.length > 0) {
        for (String w : s) {
            if (w != null && !w.trim().isEmpty()) {
                sb.append(w);
                sb.append(separator);
            }
        }
    }
    return sb.substring(0, sb.length() - 1);// length() - 1 to cut-down last extra separator
}

Вызов пользовательского метода:

String s[] = {" ","abc", "", "XYZ", "      ", null, "123", null};
String joinVal = joinNonBlankStringArray(s, ",");// "abc,XYZ,123"

Ответ 6

Только для null пропустить гуаву лучший выбор:

Joiner.on(" ").skipNulls().join("I", null, "love", null, "u")

Ответ 7

Для Java 8 вот решение с использованием потокового API

String joined = Stream.of(I, love, , u)
      .filter(s -> s != null && !s.isEmpty())
      .collect(Collectors.joining(" "));

Ответ 8

Jakarta StringUtils делает это. Вот код оттуда:

public static String join(Object[] array, String separator) {
    if (array == null) {
        return null;
    }
    return join(array, separator, 0, array.length);
}