Java: Obțineți ultimul element după divizare (Programare, Java, String, Split)

n00ki3 a intrebat.

Folosesc metoda de divizare String split și vreau să am ultimul element. dimensiunea Array-ului se poate schimba.

Exemplu:

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

Vreau să împart Șirurile de mai sus și să obțin ultimul element:

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

Nu cunosc dimensiunile array-urilor la momentul execuției 🙁

Comentarii

  • În loc de aceasta, puteți obține folosind substring și indexof. –  > Por Surendheran.
  • @SurendarKannan Răspunsul cel mai votat are un exemplu în acest sens, cu lastIndexOf. –  > Por Adam Jensen.
12 răspunsuri
Jon Skeet

Salvați array-ul într-o variabilă locală și utilizați array-ul length pentru a-i afla lungimea. Scădeți unu pentru a ține cont de faptul că este bazat pe 0:

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

Caveat emptor: dacă șirul original este compus doar din separator, de exemplu "-" sau "---", bits.length va fi 0 și se va genera o excepție ArrayIndexOutOfBoundsException. Exemplu: https://onlinegdb.com/r1M-TJkZ8

Comentarii

    27

  • Rețineți că, în cazul în care șirul de intrare este gol, a doua instrucțiune va genera o excepție „index out of bounds”. –  > Por Stephen C.
  • nu, dacă împărțiți un șir de caractere gol, va returna o matrice care conține un singur element, care este șirul gol. –  > Por Panthro.
  • Dacă șirul original este compus doar din separator, de exemplu "-" sau "---", bits.length va fi 0 și acest lucru va arunca o ArrayIndexOutOfBoundsException. Exemplu: onlinegdb.com/r1M-TJkZ8 –  > Por Dário.
  • Consultați răspunsul lui Denis Bazhenov pentru o soluție care nu aruncă ArrayIndexOutOutOfBoundsException: stackoverflow.com/a/1181976/4249576 –  > Por Dário.
Denis Bazhenov

Sau ați putea folosi lastIndexOf() metoda pe String

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

Comentarii

    16

  • cred că această soluție necesită mai puține resurse. –  > Por ufk.
  • Nu va arunca acest lucru un IndexOutOfBoundsException dacă string nu conține '-'? –  > Por Jared Beck.
  • Nu, @JaredBeck, nu conține. Dar returnează întregul șir, ceea ce poate fi sau nu ceea ce doriți. Poate ar fi mai bine să verificați mai întâi dacă caracterul pe care îl separați există în șir. –  > Por james.garriss.
  • Dar acest lucru va arunca o eroare IndexOutOfBoundsException if string conține '-' la ultima poziție –  > Por damgad.
  • @damgad, nu va fi așa. lastIndexOf va fi lungimea șirului – 1. Deci, veți obține un șir gol –  > Por Denis Bazhenov.
Ranosama

Puteți utiliza StringUtils din Apache Commons:

StringUtils.substringAfterLast(one, "-");

dfa

folosind o metodă de ajutor simplă, dar generică, ca aceasta:

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

puteți rescrie:

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

ca:

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

Comentarii

  • Un lucru pe care ar trebui să îl faceți este să protejați metoda last() împotriva tablourilor goale, altfel ați putea obține IndexOutOfBoundsException. –  > Por Denis Bazhenov.
  • @dotsid, Pe de altă parte, ar putea fi mai bine să aruncați o ArrayIndexOutOfBoundsException decât să returnați null aici, deoarece veți prinde eroarea acolo unde apare, mai degrabă atunci când aceasta cauzează problema. –  > Por Emil H.
  • @dotsid, Eu aș lăsa această responsabilitate apelantului, ascunderea excepțiilor în timpul execuției este periculoasă.  > Por dfa.
  • Foarte frumos și, bineînțeles first() și nth(T[array], int n) este frumos făcut din asta. –  > Por Peter Ajtai.
AndroidGeek
String str = "www.anywebsite.com/folder/subfolder/directory";
int index = str.lastIndexOf('/');
String lastString = str.substring(index +1);

Acum lastString are valoarea "directory"

Yash

A adunat toate căile posibile împreună!!!


Prin utilizarea lastIndexOf() & substring() metode de 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()Java SE 1.4. Împarte textul furnizat într-o matrice.

String[] split = str.split( Pattern.quote( separator ) );
String lastOne = split[split.length-1];
System.out.println("Split Array : "+ lastOne);
  • Cum se împarte șirul de caractere înainte de prima virgulă?

Java 8 secvențial ordonat stream dintr-o matrice.

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 Langjarorg.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: Google Core Libraries pentru 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);

Scripting pentru platforma Java ” Rulați Javascript pe JVM cu Rhino/Nashorn

  • Rhino ” Rhino este o implementare open-source a JavaScript scrisă în întregime în Java. De obicei, este încorporat în aplicațiile Java pentru a oferi scripting utilizatorilor finali. Este încorporat în J2SE 6 ca motor de scripting Java implicit.

  • Nashorn este un motor JavaScript dezvoltat în limbajul de programare Java de către Oracle. Se bazează pe Da Vinci Machine și a fost lansat odată cu Java 8.

Scripting Java Ghidul programatorului

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

Fișier 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); }
  • Constructor de matrice JavaScript Array sau matrice literală.

Comentarii

  • Atenție la utilizarea Java 8 Exemplu de flux. dacă despărțiți prin spațiu (” ” „) un String astfel: Basic (există un spațiu la sfârșit), veți obține Basic ca ultim element. –  > Por belgoros.
palacsint

Cu Guava:

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

Splitter, Iterables

azerafati

Din moment ce el a cerut să facă totul în aceeași linie folosind split, așa că vă sugerez acest lucru:

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

Întotdeauna evit, pe cât posibil, să definesc variabile noi și consider că este o practică foarte bună.

Comentarii

  • Dar asta va arunca un IndexOutOfBoundsException dacă șirul nu conține - –  > Por Stoinov.
  • @Stoinov, De fapt, nu o va face. Puteți testa ! 😉 –  > Por azerafati.
  • Rulează split de două ori și uneori poate fi prea lent. Deci, aceasta este o alternativă la răspunsul acceptat de a schimba viteza pentru stocare. –  > Por paulz.
  • @PaulZhang da, așa este, deși split este foarte rapid în sine, dar aceasta este o opțiune unică la cererea lui OP –  > Por azerafati.
Sean A.O. Harney

Vrei să spui că nu știi dimensiunile array-urilor la compilare? În timpul execuției, acestea ar putea fi găsite prin valoarea lui lastone.length și lastwo.length .

Hadi J

În java 8

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

Maxim Sidorov

De asemenea, puteți utiliza java.util.ArrayDeque

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

irJvV

Bănuiesc că vrei să faci asta în i line. Este posibil (un pic de jonglerie totuși =^)

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

tadaa, o linie -> rezultatul pe care îl dorești (dacă împarți pe ” – ” (spațiu minus spațiu) în loc de doar „-” (minus) vei pierde și enervantul spațiu dinaintea partiției =^) deci „Günnewig Uebachs” în loc de ” Günnewig Uebachs” (cu spațiu ca prim caracter)

Frumos în plus -> nu este nevoie de fișiere JAR suplimentare în folderul lib, astfel încât să puteți păstra aplicația ușoară.