Java: Nhận phần tử cuối cùng sau khi tách


133

Tôi đang sử dụng phương thức phân tách Chuỗi và tôi muốn có phần tử cuối cùng. Kích thước của Mảng có thể thay đổi.

Thí dụ:

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

Tôi muốn tách các Chuỗi trên và lấy mục cuối cùng:

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

Tôi không biết kích thước của các mảng khi chạy :(


1
Thay vì điều này, bạn có thể nhận được bằng cách sử dụng chuỗi con và indexof.
Surendheran

@SurendarKannan Câu trả lời được bình chọn hàng đầu có một ví dụ về điều đó, với last IndexOf.
Adam Jensen

Câu trả lời:


173

Lưu mảng trong một biến cục bộ và sử dụng trường của mảng lengthđể tìm độ dài của nó. Trừ một tài khoản cho nó dựa trên 0:

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

Caveat emptor: nếu chuỗi ban đầu chỉ bao gồm dấu phân cách, ví dụ "-"hoặc "---", bits.lengthsẽ là 0 và điều này sẽ ném ra một ArrayIndexOutOfBoundException. Ví dụ: https://onlinegdb.com/r1M-TJkZ8


27
Chỉ cần lưu ý rằng trong trường hợp chuỗi đầu vào trống, câu lệnh thứ hai sẽ đưa ra một ngoại lệ "chỉ mục ngoài giới hạn".
Stephen C

7
không, nếu bạn tách một chuỗi trống, nó sẽ trả về một mảng chứa một phần tử là chính chuỗi đó.
Panthro

Nếu chuỗi ban đầu chỉ bao gồm dấu phân cách, ví dụ "-"hoặc "---", bits.lengthsẽ là 0 và điều này sẽ tạo ra một ArrayIndexOutOfBoundException. Ví dụ: onlinegdb.com/r1M-TJkZ8
Dário

Xem câu trả lời của Denis Bazhenov cho một giải pháp không ném ArrayIndexOutOfBoundException: stackoverflow.com/a/1181976/4249576
Dário

250

Hoặc bạn có thể sử dụng lastIndexOf()phương thức trên Chuỗi

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

16
Tôi nghĩ rằng giải pháp này tốn ít tài nguyên hơn.
ufk

Điều này sẽ không ném IndexOutOfBoundsExceptionnếu stringkhông có '-'?
Jared Beck

6
Không, @JaredBeck, không. Nhưng nó trả về toàn bộ chuỗi, có thể có hoặc không muốn bạn muốn. Có thể tốt hơn để kiểm tra xem ký tự bạn đang tách có tồn tại trong chuỗi trước không.
james.garriss

1
Nhưng điều đó sẽ ném một IndexOutOfBoundsExceptionnếu stringchứa '-'ở vị trí cuối cùng
damgad

8
@damgad, nó sẽ không. last IndexOf sẽ là độ dài của chuỗi - 1. Vì vậy, bạn sẽ kết thúc với chuỗi trống
Denis Bazhenov


23

sử dụng một phương thức trợ giúp đơn giản nhưng chung chung như thế này:

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

bạn có thể viết lại:

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

như:

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

3
Một điều bạn nên làm là bảo vệ phương thức last () trước các mảng trống hoặc bạn có thể nhận IndexOutOfBoundException.
Denis Bazhenov

@dotsid, mặt khác, có thể tốt hơn là ném một ArrayIndexOutOfBoundException thay vì trả về null ở đây, vì bạn sẽ bắt gặp lỗi xảy ra khi nó gây ra sự cố.
Emil H

1
@dotsid, tôi sẽ giao trách nhiệm này cho người gọi, ẩn các ngoại lệ thời gian chạy là nguy hiểm
dfa

Rất đẹp, và tất nhiên first()nth(T[array], int n)được làm độc đáo từ điều này.
Peter Ajtai

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

Bây giờ lastStringcó giá trị"directory"


7

Với ổi :

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

Tập hợp tất cả các cách có thể với nhau !!


Bằng cách sử dụng lastIndexOf()& substring()phương pháp củaJava.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()Java SE 1.4 . Chia văn bản được cung cấp thành một mảng.

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

Luồng thứ tự tuần tự Java 8 từ một mảng.

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: Thư viện Google Core cho Java. «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);

Viết kịch bản cho Nền tảng Java «Chạy Javascript trên JVM với Rhino / Nashorn

  • Rhino «Rhino là một triển khai JavaScript nguồn mở được viết hoàn toàn bằng Java. Nó thường được nhúng vào các ứng dụng Java để cung cấp kịch bản cho người dùng cuối. Nó được nhúng trong J2SE 6 như là công cụ kịch bản Java mặc định.

  • Nashorn là một công cụ JavaScript được phát triển bằng ngôn ngữ lập trình Java bởi Oracle. Nó dựa trên Da Vinci Machine và đã được phát hành với Java 8.

Hướng dẫn lập trình Java Scripting

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

Tệp JavaScript « 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); }

Chú ý khi sử dụng ví dụ Java 8 Stream. nếu bạn phân tách theo dấu cách ("") một Chuỗi như thế này: Basic (có một khoảng trắng ở cuối), bạn sẽ lấy Basiclàm phần tử cuối cùng.
belgoros

5

Vì anh ấy đã yêu cầu làm tất cả trong cùng một dòng bằng cách sử dụng split nên tôi đề nghị điều này:

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

Tôi luôn tránh xác định các biến mới càng xa càng tốt và tôi thấy đó là một cách thực hành rất tốt


Nhưng điều đó sẽ ném một IndexOutOfBoundsExceptionchuỗi nếu không chứa-
Stoinov

@Stoinov, Thật ra thì không. bạn có thể kiểm tra nó ;)
azerafati

1
Nó chạy tách hai lần và đôi khi có thể quá chậm. Vì vậy, đây là một thay thế cho câu trả lời được chấp nhận cho tốc độ giao dịch để lưu trữ.
paulz

@PaulZhang yup đúng, mặc dù bản thân nó rất nhanh, nhưng đây là một tùy chọn lót theo yêu cầu của OP
azerafati

3

Bạn có nghĩa là bạn không biết kích thước của các mảng tại thời gian biên dịch? Tại thời điểm chạy chúng có thể được tìm thấy bởi giá trị của lastone.lengthlastwo.length.


3

Trong java 8

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

1

Tôi đoán bạn muốn làm điều này trong dòng i. Có thể (một chút tung hứng mặc dù = ^)

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

tadaa, một dòng -> kết quả bạn muốn (nếu bạn tách trên "-" (dấu cách trừ khoảng trắng) thay vì chỉ "-" (trừ) bạn sẽ mất khoảng trống khó chịu trước khi phân vùng quá = ^) vì vậy "Günnewig Uebachs" thay vì "Günnewig Uebachs" (với khoảng trắng là ký tự đầu tiên)

Thêm đẹp -> không cần thêm tệp JAR trong thư mục lib để bạn có thể giữ cho ứng dụng của bạn nhẹ.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.