자바 : 분할 후 마지막 요소 가져 오기


133

String split 메소드를 사용하고 있으며 마지막 요소를 갖고 싶습니다. 어레이의 크기는 변경 될 수 있습니다.

예:

String one = "Düsseldorf - Zentrum - Günnewig Uebachs"
String two = "Düsseldorf - Madison"

위의 문자열을 나누고 마지막 항목을 얻고 싶습니다.

lastone = one.split("-")[here the last item] // <- how?
lasttwo = two.split("-")[here the last item] // <- how?

런타임에 배열의 크기를 모른다 :(


1
이 대신 부분 문자열과 indexof를 사용할 수 있습니다.
Surendheran

@SurendarKannan 가장 많이 투표 된 답변에는 lastIndexOf가 있습니다.
Adam Jensen

답변:


173

배열을 로컬 변수에 저장하고 배열 length필드를 사용하여 길이를 찾으십시오. 0을 기준으로 1을 빼십시오.

String[] bits = one.split("-");
String lastOne = bits[bits.length-1];

주의 사항 : 원본 문자열이 구분자로 구성되어 있으면 (예 : "-"또는 "---") bits.length0이되고 ArrayIndexOutOfBoundsException이 발생합니다. 예 : https://onlinegdb.com/r1M-TJkZ8


27
입력 문자열이 비어있는 경우 두 번째 명령문은 "인덱스 범위를 벗어남"예외를 발생시킵니다.
Stephen C

7
빈 문자열을 분할하면 빈 문자열 자체 인 하나의 요소가 포함 된 배열을 반환합니다.
Panthro

원래 문자열이 구분 기호로만 구성된 경우 (예 : "-"또는 "---") bits.length0이되고 ArrayIndexOutOfBoundsException이 발생합니다. 예 : onlinegdb.com/r1M-TJkZ8
Dário

ArrayIndexOutOfBoundsException을 발생시키지 않는 솔루션에 대해서는 Denis Bazhenov의 답변을 참조하십시오. stackoverflow.com/a/1181976/4249576
Dário

250

또는 lastIndexOf()String에서 메소드를 사용할 수 있습니다

String last = string.substring(string.lastIndexOf('-') + 1);

16
이 솔루션은 더 적은 리소스를 사용한다고 생각합니다.
ufk

이 포함되지 않는 IndexOutOfBoundsException경우 던져 ? string'-'
Jared Beck

6
아니요, @JaredBeck은 그렇지 않습니다. 그러나 원하는 전체 문자열을 반환하거나 원하지 않을 수도 있습니다. 분할하려는 문자가 먼저 문자열에 있는지 확인하는 것이 좋습니다.
james.garriss

1
그러나 그것은 마지막 위치에 IndexOutOfBoundsExceptionif string포함 '-'을 던질 것입니다
damgad

8
@ damgad, 그렇지 않습니다. lastIndexOf는 문자열 길이-1입니다. 따라서 빈 문자열로 끝납니다
Denis Bazhenov


23

다음과 같이 간단하지만 일반적인 도우미 메소드를 사용하십시오.

public static <T> T last(T[] array) {
    return array[array.length - 1];
}

당신은 다시 쓸 수 있습니다 :

lastone = one.split("-")[..];

같이:

lastone = last(one.split("-"));

3
빈 배열로부터 last () 메서드를 보호하거나 IndexOutOfBoundsException을 얻을 수 있습니다.
Denis Bazhenov

@dotsid, 반면에, 문제를 일으킬 때 발생하는 오류를 잡을 수 있기 때문에 여기서 null을 반환하는 대신 ArrayIndexOutOfBoundsException을 발생시키는 것이 좋습니다.
Emil H

1
@dotsid, 나는이 책임을 호출자에게 맡기겠다. 런타임 예외를 숨기는 것은 위험하다
dfa

, 물론 아주 좋은 first()nth(T[array], int n)친절이 만들어진다.
피터 아지 타이

12
String str = "www.anywebsite.com/folder/subfolder/directory";
int index = str.lastIndexOf('/');
String lastString = str.substring(index +1);

이제 lastString가치가있다"directory"


7

구아바 와 함께 :

final Splitter splitter = Splitter.on("-").trimResults();
assertEquals("Günnewig Uebachs", Iterables.getLast(splitter.split(one)));
assertEquals("Madison", Iterables.getLast(splitter.split(two)));

Splitter, Iterables


7

가능한 모든 방법을 모았습니다!


lastIndexOf()& substring()방법을 사용하여Java.lang.String

// int firstIndex = str.indexOf( separator );
int lastIndexOf = str.lastIndexOf( separator );
String begningPortion = str.substring( 0, lastIndexOf );
String endPortion = str.substring( lastIndexOf + 1 );
System.out.println("First Portion : " + begningPortion );
System.out.println("Last  Portion : " + endPortion );

split()자바 SE 1.4 . 제공된 텍스트를 배열로 분할합니다.

String[] split = str.split( Pattern.quote( separator ) );
String lastOne = split[split.length-1];
System.out.println("Split Array : "+ lastOne);

배열에서 Java 8 순차 순서 스트림 .

String firstItem = Stream.of( split )
                         .reduce( (first,last) -> first ).get();
String lastItem = Stream.of( split )
                        .reduce( (first,last) -> last ).get();
System.out.println("First Item : "+ firstItem);
System.out.println("Last  Item : "+ lastItem);

Apache Commons Lang jar «org.apache.commons.lang3.StringUtils

String afterLast = StringUtils.substringAfterLast(str, separator);
System.out.println("StringUtils AfterLast : "+ afterLast);

String beforeLast = StringUtils.substringBeforeLast(str, separator);
System.out.println("StringUtils BeforeLast : "+ beforeLast);

String open = "[", close = "]";
String[] groups = StringUtils.substringsBetween("Yash[777]Sam[7]", open, close);
System.out.println("String that is nested in between two Strings "+ groups[0]);

Guava: Java 용 Google 핵심 라이브러리. «com.google.common.base.Splitter

Splitter splitter = Splitter.on( separator ).trimResults();
Iterable<String> iterable = splitter.split( str );
String first_Iterable = Iterables.getFirst(iterable, "");
String last_Iterable = Iterables.getLast( iterable );
System.out.println(" Guava FirstElement : "+ first_Iterable);
System.out.println(" Guava LastElement  : "+ last_Iterable);

Java 플랫폼 스크립팅 «Rhino / Nashorn을 사용하여 JVM에서 Javascript 실행

  • Rhino «Rhino는 Java로만 작성된 JavaScript의 오픈 소스 구현입니다. 일반적으로 최종 사용자에게 스크립팅을 제공하기 위해 Java 애플리케이션에 임베드됩니다. J2SE 6에 기본 Java 스크립팅 엔진으로 임베드됩니다.

  • Nashorn은 Oracle에서 Java 프로그래밍 언어로 개발 한 JavaScript 엔진입니다. Da Vinci Machine을 기반으로하며 Java 8과 함께 릴리스되었습니다.

Java 스크립팅 프로그래머 안내서

public class SplitOperations {
    public static void main(String[] args) {
        String str = "my.file.png.jpeg", separator = ".";
        javascript_Split(str, separator);
    }
    public static void javascript_Split( String str, String separator ) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        // Script Variables « expose java objects as variable to script.
        engine.put("strJS", str);

        // JavaScript code from file
        File file = new File("E:/StringSplit.js");
        // expose File object as variable to script
        engine.put("file", file);

        try {
            engine.eval("print('Script Variables « expose java objects as variable to script.', strJS)");

            // javax.script.Invocable is an optional interface.
            Invocable inv = (Invocable) engine;

            // JavaScript code in a String
            String functions = "function functionName( functionParam ) { print('Hello, ' + functionParam); }";
            engine.eval(functions);
            // invoke the global function named "functionName"
            inv.invokeFunction("functionName", "function Param value!!" );

            // evaluate a script string. The script accesses "file" variable and calls method on it
            engine.eval("print(file.getAbsolutePath())");
            // evaluate JavaScript code from given file - specified by first argument
            engine.eval( new java.io.FileReader( file ) );

            String[] typedArray = (String[]) inv.invokeFunction("splitasJavaArray", str );
            System.out.println("File : Function returns an array : "+ typedArray[1] );

            ScriptObjectMirror scriptObject = (ScriptObjectMirror) inv.invokeFunction("splitasJavaScriptArray", str, separator );
            System.out.println("File : Function return script obj : "+ convert( scriptObject ) );

            Object eval = engine.eval("(function() {return ['a', 'b'];})()");
            Object result = convert(eval);
            System.out.println("Result: {}"+ result);

            // JavaScript code in a String. This code defines a script object 'obj' with one method called 'hello'.
            String objectFunction = "var obj = new Object(); obj.hello = function(name) { print('Hello, ' + name); }";
            engine.eval(objectFunction);
            // get script object on which we want to call the method
            Object object = engine.get("obj");
            inv.invokeMethod(object, "hello", "Yash !!" );

            Object fileObjectFunction = engine.get("objfile");
            inv.invokeMethod(fileObjectFunction, "hello", "Yashwanth !!" );
        } catch (ScriptException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static Object convert(final Object obj) {
        System.out.println("\tJAVASCRIPT OBJECT: {}"+ obj.getClass());
        if (obj instanceof Bindings) {
            try {
                final Class<?> cls = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror");
                System.out.println("\tNashorn detected");
                if (cls.isAssignableFrom(obj.getClass())) {
                    final Method isArray = cls.getMethod("isArray");
                    final Object result = isArray.invoke(obj);
                    if (result != null && result.equals(true)) {
                        final Method values = cls.getMethod("values");
                        final Object vals = values.invoke(obj);
                        System.err.println( vals );
                        if (vals instanceof Collection<?>) {
                            final Collection<?> coll = (Collection<?>) vals;
                            Object[] array = coll.toArray(new Object[0]);
                            return array;
                        }
                    }
                }
            } catch (ClassNotFoundException | NoSuchMethodException | SecurityException
                    | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            }
        }
        if (obj instanceof List<?>) {
            final List<?> list = (List<?>) obj;
            Object[] array = list.toArray(new Object[0]);
            return array;
        }
        return obj;
    }
}

자바 스크립트 파일« StringSplit.js

// var str = 'angular.1.5.6.js', separator = ".";
function splitasJavaArray( str ) {
  var result = str.replace(/\.([^.]+)$/, ':$1').split(':');
  print('Regex Split : ', result);
  var JavaArray = Java.to(result, "java.lang.String[]");
  return JavaArray;
  // return result;
}
function splitasJavaScriptArray( str, separator) {
    var arr = str.split( separator ); // Split the string using dot as separator
    var lastVal = arr.pop(); // remove from the end
    var firstVal = arr.shift(); // remove from the front
    var middleVal = arr.join( separator ); // Re-join the remaining substrings

    var mainArr = new Array();
    mainArr.push( firstVal ); // add to the end
    mainArr.push( middleVal );
    mainArr.push( lastVal );

    return mainArr;
}

var objfile = new Object();
objfile.hello = function(name) { print('File : Hello, ' + name); }

Java 8 Stream 예제를 사용할 때주의하십시오. 공백 ( "")으로 문자열을 다음과 같이 Basic 나누면 (후행 공백이 있음) Basic마지막 요소가됩니다.
belgoros

5

그는 split을 사용하여 동일한 줄에서 모든 작업을 수행하도록 요청 했으므로 다음과 같이 제안합니다.

lastone = one.split("-")[(one.split("-")).length -1]  

나는 항상 가능한 한 새로운 변수를 정의하는 것을 피하고 아주 좋은 습관을 찾습니다.


그러나 IndexOutOfBoundsException문자열에 포함되지 않은 경우-
Stoinov

@Stoinov, 실제로는 그렇지 않습니다. 당신은 그것을 테스트 할 수 있습니다! ;)
azerafati

1
두 번 분할되어 실행되며 때로는 너무 느릴 수 있습니다. 따라서 이것은 저장을위한 거래 속도에 대한 정답에 대한 대안입니다.
paulz

분할은 매우 빠르게 그 자체이지만,이 영업 이익의 요청에 따라 하나의 라이너 옵션입니다하지만, 맞아 @PaulZhang의 넵
azerafati

3

컴파일 타임에 배열의 크기를 모른다는 것을 의미합니까? 런타임시 lastone.length및 의 값으로 찾을 수 있습니다 lastwo.length.


3

자바 8에서

String lastItem = Stream.of(str.split("-")).reduce((first,last)->last).get();

1

나는 당신이 i 라인에서 이것을하고 싶다고 생각합니다. 가능합니다 (= ^이지만 약간의 저글링)

new StringBuilder(new StringBuilder("Düsseldorf - Zentrum - Günnewig Uebachs").reverse().toString().split(" - ")[0]).reverse()

tadaa, 한 줄-> 원하는 결과 ( "-"(빼기) 대신 "-"(공간 빼기 공간)으로 나눠서 분할하기 전에 성가신 공간을 잃을 것입니다 = ^)) "Günnewig Uebachs" "Günnewig Uebachs"대신 (첫 문자로 공백 포함)

멋진 추가-> lib 폴더에 추가 JAR 파일이 필요하지 않으므로 응용 프로그램을 경량으로 유지할 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.