PHP의 implode ( ',', array_filter (array ()))에 해당하는 Java
저는 PHP에서이 코드를 자주 사용합니다.
$ordine['address'] = implode(', ', array_filter(array($cliente['cap'], $cliente['citta'] ,$cliente['provincia'])));
빈 문자열을 지우고 ","로 결합합니다. 하나만 남아 있으면 불필요한 쉼표를 추가하지 않습니다. 끝에 쉼표를 추가하지 않습니다. 아무것도 남아 있지 않으면 빈 문자열을 반환합니다.
따라서 다음 결과 중 하나를 얻을 수 있습니다.
""
"Street abc 14"
"Street abc 14, 00168"
"Street abc 14, 00168, Rome"
외부 라이브러리를 추가하지 않고도 (Android 용으로 설계 ) Java에서 가장 좋은 Java 구현 (더 적은 코드)은 무엇입니까?
Java 8을 사용하여 업데이트 된 버전 (게시물 끝에 원본)
요소를 필터링 할 필요가없는 경우 사용할 수 있습니다.
String.join (CharSequence 구분 기호,
CharSequence...
요소)String.join(" > ", new String[]{"foo", "bar"});
String.join(" > ", "foo", "bar");
또는 String.join (CharSequence 구분 기호,
Iterable<? extends CharSequence>
요소)String.join(" > ", Arrays.asList("foo", "bar"));
Java 8 이후로 StringJoiner
(원래 사용 된 대신 StringBulder
) 사용 하고 코드를 단순화 할 수 있습니다.
또한 " *"
각 호출에서 정규식을 다시 컴파일하는 것을 방지하기 위해 matches(" *")
일부 필드에 컴파일 된 버전을 보관하고 필요할 때 사용할 수있는 별도의 패턴을 만들 수 있습니다.
private static final Pattern SPACES_OR_EMPTY = Pattern.compile(" *");
public static String implode(String separator, String... data) {
StringJoiner sb = new StringJoiner(separator);
for (String token : data) {
if (!SPACES_OR_EMPTY.matcher(token).matches()) {
sb.add(token);
}
}
return sb.toString();
}
스트림을 사용하면 코드가 다음과 같이 보일 수 있습니다.
private static final Predicate<String> IS_NOT_SPACES_ONLY =
Pattern.compile("^\\s*$").asPredicate().negate();
public static String implode(String delimiter, String... data) {
return Arrays.stream(data)
.filter(IS_NOT_SPACES_ONLY)
.collect(Collectors.joining(delimiter));
}
우리는 스트림을 사용하는 경우 우리가 할 수있는 filter
요소가있는 Predicate
. 이 경우 우리는 술어가 공백이 아닌 문자열을 받아들이기를 원합니다. 즉, 문자열은 공백이 아닌 문자를 포함해야합니다.
패턴에서 이러한 술어를 만들 수 있습니다. 술어는 정규식 일치 될 수있는 문자열을 포함 모든 문자열을 받아 들일 것입니다 이런 식으로 (그래서 정규식을 찾을 것입니다 경우 생성 "\\S"
과 같은 문자열을 받아 들일 것 술어 "foo "
, " foo bar "
, "whatever"
, 그러나 수락하지 않습니다 " "
도를 " "
).
그래서 우리는
Pattern.compile("\\S").asPredicate();
또는 조금 더 설명 적이거나 공백 만 있거나 비어있는 문자열의 부정
Pattern.compile("^\\s*$").asPredicate().negate();
다음으로 필터가 비어 있거나 공백 만 포함 된 문자열 만 제거하면 collect
나머지 요소를 사용할 수 있습니다 . 덕분에 Collectors.joining
사용할 구분 기호를 결정할 수 있습니다.
원래 답변 (Java 8 이전)
public static String implode(String separator, String... data) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length - 1; i++) {
//data.length - 1 => to not add separator at the end
if (!data[i].matches(" *")) {//empty string are ""; " "; " "; and so on
sb.append(data[i]);
sb.append(separator);
}
}
sb.append(data[data.length - 1].trim());
return sb.toString();
}
다음과 같이 사용할 수 있습니다.
System.out.println(implode(", ", "ab", " ", "abs"));
또는
System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));
산출 ab, abs
왜 그렇게 심각한가요? 시도해보십시오 StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
!
ArrayList에 문자열을 추가하고 빈 문자열을 제거한 다음 그에 따라 형식을 지정해야합니다.
public static String createAddressString( String street, String zip_code, String country) {
List<String> list = new ArrayList<String>();
list.add( street);
list.add( zip_code);
list.add( country);
// Remove all empty values
list.removeAll(Arrays.asList("", null));
// If this list is empty, it only contained blank values
if( list.isEmpty()) {
return "";
}
// Format the ArrayList as a string, similar to implode
StringBuilder builder = new StringBuilder();
builder.append( list.remove(0));
for( String s : list) {
builder.append( ", ");
builder.append( s);
}
return builder.toString();
}
또한 String[]
문자열 배열이있는 경우 쉽게 ArrayList에 추가 할 수 있습니다.
String[] s;
List<String> list = new ArrayList<String>( Arrays.asList( s));
다음은 일부 사용자에게 도움이 될 수있는 Android 관련 답변입니다.
String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"});
//Result => Red,Green,Blue
TextUtils 클래스를 가져와야합니다.
import android.text.TextUtils;
단순한 파열
public static String implode(String glue, String[] strArray)
{
String ret = "";
for(int i=0;i<strArray.length;i++)
{
ret += (i == strArray.length - 1) ? strArray[i] : strArray[i] + glue;
}
return ret;
}
이에 대한 오버로드를 생성 할 수 있습니다 ..
위는 php implode와 동일합니다.
원하는 것은 다음과 같습니다.
import java.lang.*
public static String customImplode(String glue, String[] strArray)
{
String ret = "";
for(int i=0;i<strArray.length;i++)
{
if (strArray[i].trim() != "")
ret += (i == strArray.length - 1) ? strArray[i] : strArray[i] + glue;
}
return ret;
}
Streams (Java 8 이상용)를 사용하는 것이 이에 대한 대안이 될 수 있습니다. 가져와야합니다.
java.util.stream.Collectors;
조인 프로세스를 사용하려면
다음을 사용할 수 있습니다.
Arrays.asList("foo","bar").stream().collect(Collectors.joining(","));
원하는 결과를 얻을 수 있습니다.
내 implode 구현은 다음과 같습니다.
/**
* Implodes the specified items, gluing them using the specified glue replacing nulls with the specified
* null placeholder.
* @param glue The text to use between the specified items.
* @param nullPlaceholder The placeholder to use for items that are <code>null</code> value.
* @param items The items to implode.
* @return A <code>String</code> containing the items in their order, separated by the specified glue.
*/
public static final String implode(String glue, String nullPlaceholder, String ... items) {
StringBuilder sb = new StringBuilder();
for (String item : items) {
if (item != null) {
sb.append(item);
} else {
sb.append(nullPlaceholder);
}
sb.append(glue);
}
return sb.delete(sb.length() - glue.length(), sb.length()).toString();
}
public static String implode(List<String> items, String separator) {
if (items == null || items.isEmpty()) {
return null;
}
String delimiter = "";
StringBuilder builder = new StringBuilder();
for (String item : items) {
builder.append(delimiter).append(item);
delimiter = separator;
}
return builder.toString();
}
이 간단한 기능을 사용하십시오.
private String my_implode(String spacer,String[] in_array){
String res = "";
for(int i = 0 ; i < in_array.length ; i++){
if( !res.equals("") ){
res += spacer;
}
res += in_array[i];
}
return res;
}
사용하다 :
data_arr = {"d1","d2","d3"};
your_imploded_text = my_implode(",", data_arr);
//output : your_imploded_text = "d1,d2,d3"
참고 URL : https://stackoverflow.com/questions/11248119/java-equivalent-of-phps-implode-array-filter-array
'Development Tip' 카테고리의 다른 글
파이썬에서 URL을 여는 방법 (0) | 2020.11.09 |
---|---|
Python : 문자열 이름에서 함수 호출 (0) | 2020.11.09 |
Laravel에 데이터베이스 테이블이 있는지 감지하는 방법이 있습니까? (0) | 2020.11.09 |
Linux에서 Atom 텍스트 편집기를 제거하는 방법은 무엇입니까? (0) | 2020.11.09 |
순수한 Swift 프로젝트에서 실행중인 단위 테스트를 앱에 알리는 방법은 무엇입니까? (0) | 2020.11.09 |