Java: Dapatkan elemen terakhir setelah pemisahan

134

Saya menggunakan metode pemisahan String dan saya ingin memiliki elemen terakhir. Ukuran Array bisa berubah.

Contoh:

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

Saya ingin membagi String di atas dan mendapatkan item terakhir:

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

Saya tidak tahu ukuran array saat runtime :(

n00ki3
sumber
1
Alih-alih ini, Anda bisa menggunakan substring dan indexof.
Surendheran
@SurendarKannan Jawaban pilihan teratas memiliki contohnya, dengan lastIndexOf.
Adam Jensen

Jawaban:

178

Simpan larik dalam variabel lokal dan gunakan bidang larik lengthuntuk mencari panjangnya. Kurangi satu untuk memperhitungkannya menjadi berbasis 0:

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

Caveat emptor: jika string asli hanya terdiri dari pemisah, misalnya "-"atau "---", bits.lengthakan menjadi 0 dan ini akan memunculkan ArrayIndexOutOfBoundsException. Contoh: https://onlinegdb.com/r1M-TJkZ8

Jon Skeet
sumber
27
Perlu diketahui bahwa dalam kasus di mana string input kosong, pernyataan kedua akan memunculkan pengecualian "indeks di luar batas".
Stephen C
7
no it wont, jika Anda memisahkan string kosong itu akan mengembalikan array yang berisi satu elemen yang merupakan string kosong itu sendiri.
Panthro
Jika string asli hanya terdiri dari pemisah, misalnya "-"atau "---", bits.lengthakan menjadi 0 dan ini akan memunculkan ArrayIndexOutOfBoundsException. Contoh: onlinegdb.com/r1M-TJkZ8
Dário
Lihat jawaban Denis Bazhenov untuk solusi yang tidak membuang ArrayIndexOutOfBoundsException: stackoverflow.com/a/1181976/4249576
Dário
252

Atau Anda bisa menggunakan lastIndexOf()metode pada String

String last = string.substring(string.lastIndexOf('-') + 1);
Denis Bazhenov
sumber
16
saya pikir solusi ini membutuhkan lebih sedikit sumber daya.
Uuf
Bukankah lemparan ini IndexOutOfBoundsExceptionjika stringtidak mengandung '-'?
Jared Beck
6
Tidak, @JaredBeck, tidak. Tapi itu mengembalikan seluruh string, yang mungkin atau mungkin tidak Anda inginkan. Mungkin lebih baik memeriksa bahwa karakter yang Anda pisahkan ada di string terlebih dahulu.
james.garriss
1
Tapi itu akan membuang IndexOutOfBoundsExceptionjika stringberisi '-'pada posisi terakhir
damgad
8
@ Sialan, tidak akan. lastIndexOf akan menjadi panjang string - 1. Jadi, Anda akan berakhir dengan string kosong
Denis Bazhenov
33

Anda dapat menggunakan kelas StringUtils di Apache Commons:

StringUtils.substringAfterLast(one, "-");
Ranosama
sumber
23

menggunakan metode pembantu yang sederhana, namun umum, seperti ini:

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

Anda bisa menulis ulang:

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

sebagai:

lastone = last(one.split("-"));
dfa
sumber
3
Satu hal yang harus Anda lakukan adalah melindungi metode last () terhadap larik kosong atau Anda bisa mendapatkan IndexOutOfBoundsException.
Denis Bazhenov
@dotsid, Di sisi lain, mungkin lebih baik untuk menampilkan ArrayIndexOutOfBoundsException daripada mengembalikan null di sini, karena Anda akan menangkap kesalahan di tempat itu terjadi daripada ketika itu menyebabkan masalah.
Emil H
1
@dotsid, saya akan menyerahkan tanggung jawab ini kepada pemanggil, menyembunyikan pengecualian runtime itu berbahaya
dfa
Sangat bagus, dan tentu saja first()dan nth(T[array], int n)terbuat dari ini.
Peter Ajtai
14
String str = "www.anywebsite.com/folder/subfolder/directory";
int index = str.lastIndexOf('/');
String lastString = str.substring(index +1);

Sekarang lastStringada nilainya"directory"

AndroidGeek
sumber
10

Kumpulkan semua cara yang mungkin bersama !!


Dengan menggunakan lastIndexOf()& substring()metodeJava.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 . Membagi teks yang disediakan menjadi larik.

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

Java 8 urutan aliran berurutan dari array.

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

Tabung Apache Commons Lang «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: Perpustakaan Inti Google untuk 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);

Pembuatan Skrip untuk Platform Java «Jalankan Javascript di JVM dengan Rhino / Nashorn

  • Rhino «Rhino adalah implementasi open-source dari JavaScript yang seluruhnya ditulis di Jawa. Ini biasanya disematkan ke dalam aplikasi Java untuk menyediakan skrip kepada pengguna akhir. Itu tertanam di J2SE 6 sebagai mesin skrip Java default.

  • Nashorn adalah mesin JavaScript yang dikembangkan dalam bahasa pemrograman Java oleh Oracle. Ini didasarkan pada Mesin Da Vinci dan telah dirilis dengan Java 8.

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

File 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); }
Yash
sumber
Perhatian saat menggunakan contoh Java 8 Stream. jika Anda memisahkan dengan spasi ("") String seperti ini: Basic (ada spasi tambahan), Anda akan mendapatkan Basicelemen terakhir.
belgoros
7

Dengan Jambu Biji :

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

Splitter, Iterables

palacsint.dll
sumber
5

Karena dia meminta untuk melakukan semuanya di baris yang sama menggunakan split jadi saya menyarankan ini:

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

Saya selalu menghindari mendefinisikan variabel baru sejauh yang saya bisa, dan menurut saya ini adalah praktik yang sangat baik

azerafati.dll
sumber
Tapi itu akan melempar IndexOutOfBoundsExceptionjika string tidak berisi-
Stoinov
@Stoinov, Sebenarnya tidak. kamu bisa mengujinya! ;)
azerafati
1
Ini berjalan terpisah dua kali dan terkadang bisa terlalu lambat. Jadi ini adalah alternatif jawaban yang diterima untuk menukar kecepatan untuk penyimpanan.
paulz
@PaulZhang ya benar, meskipun perpecahan itu sendiri sangat cepat, tetapi ini adalah opsi satu liner sesuai permintaan OP
azerafati
3

Maksud Anda, Anda tidak tahu ukuran array pada waktu kompilasi? Pada saat run-time mereka dapat ditemukan dengan nilai lastone.lengthdan lastwo.length.

Sean AO Harney
sumber
3

Di java 8

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

Anda juga bisa menggunakan java.util.ArrayDeque

String last = new ArrayDeque<>(Arrays.asList("1-2".split("-"))).getLast();
Maxim Sidorov
sumber
1

Saya kira Anda ingin melakukan ini di baris saya. Itu mungkin (sedikit juggling meskipun = ^)

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

tadaa, satu baris -> hasil yang Anda inginkan (jika Anda membagi pada "-" (spasi dikurangi spasi) alih-alih hanya "-" (minus) Anda akan kehilangan ruang yang mengganggu sebelum partisi juga = ^) jadi "Günnewig Uebachs" bukannya "Günnewig Uebachs" (dengan spasi sebagai karakter pertama)

Bagus ekstra -> tidak perlu file JAR tambahan di folder lib sehingga Anda dapat menjaga aplikasi Anda tetap ringan.

irJvV
sumber