Присоединиться к запятой, если не пустой или пустой
Я видел этот ответ о том, как связать 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);
}