programing

PHP의 innode(' , , array_filter(array ))에 상당하는 Java

sourcejob 2022. 11. 3. 21:50
반응형

PHP의 innode(' , , 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을 사용한 버전 업데이트(투고 종료 시 원본)

사용할 수 있는 요소를 필터링할 필요가 없는 경우


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이 경우 술어는 공백뿐만 아니라 공백이 아닌 문자열을 받아들이도록 합니다.즉, 문자열에는 공백이 아닌 문자가 포함되어야 합니다.

이러한 술어는 패턴으로부터 작성할 수 있습니다.이렇게 작성된 술어는 regex와 일치할 수 있는 서브스트링을 포함하는 모든 문자열을 받아들입니다(따라서 regex가 다음을 찾을 경우)."\\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", "!"}, ", ")!

다음은 일부 사용자에게 도움이 될 수 있는 Android 고유의 답변입니다.

String combined = TextUtils.join(",", new String[]{"Red", "Green", "Blue"});

// Result => Red,Green,Blue

TextUtils 클래스를 Import해야 합니다.

import android.text.TextUtils;

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

이를 위해 Streams(Java 8 이후)를 사용하는 것이 다른 해결책이 될 수 있습니다.

Import가 필요합니다.

java.util.stream.Collectors;

결합 과정을 이용하다

다음을 사용할 수 있습니다.

Arrays.asList("foo","bar").stream().collect(Collectors.joining(","));

원하는 결과를 얻을 수 있습니다.

심플한 인소드

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

과부하를 만들 수 있습니다.

【hpp innode】【hp innode】【hp innode】
것은 .

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

다음은 내구성 구현입니다. 구현입니다.

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

반응형