studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones java string split

programacion - Java: obtener el último elemento después de la división



manual de programacion android pdf (12)

Estoy usando el método de división de cadenas y quiero tener el último elemento. El tamaño de la matriz puede cambiar.

Ejemplo:

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

Quiero dividir las cadenas anteriores y obtener el último elemento:

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

No sé los tamaños de las matrices en tiempo de ejecución :(


¡Reunidos todos los caminos posibles juntos!

Al utilizar los lastIndexOf() y substring() 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 . Divide el texto proporcionado en una matriz.

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

  • Cómo dividir String antes de la primera coma?

Secuencia ordenada secuencial Java 8 de una matriz.

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 : Google Core Libraries para 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);

Creación de scripts para la plataforma Java «Ejecutar Javascript en la JVM con Rhino / Nashorn

  • Rhino «Rhino es una implementación de código abierto de JavaScript escrita completamente en Java. Normalmente está integrado en las aplicaciones Java para proporcionar scripts a los usuarios finales. Está integrado en J2SE 6 como el motor de scripts Java predeterminado.

  • Nashorn es un motor de JavaScript desarrollado en el lenguaje de programación Java por Oracle. Se basa en la máquina Da Vinci y se ha lanzado con Java 8.

Guía del programador de scripting de 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; } }

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

  • Array de JavaScript Array o Literal .

¿Quiere decir que no conoce los tamaños de las matrices en tiempo de compilación? En el tiempo de ejecución, podrían encontrarse por el valor de lastone.length y lastwo.length .


Como él estaba pidiendo que lo hiciera todo en la misma línea usando split, entonces sugiero esto:

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

Siempre evito definir nuevas variables tanto como puedo, y me parece una muy buena práctica


Con 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


En java 8

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


Guarde la matriz en una variable local y use el campo de length la matriz para encontrar su longitud. Reste uno para dar cuenta de que está basado en 0:

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


O puede usar el método lastIndexOf() en String

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


Puede usar la clase StringUtils en Apache Commons:

StringUtils.substringAfterLast(one, "-");


Supongo que quieres hacer esto en línea. Es posible (un poco de malabares aunque = ^)

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

tadaa, una línea -> el resultado que desea (si divide en "-" (espacio menos espacio) en lugar de solo "-" (menos), también perderá el espacio molesto antes de la partición = ^) entonces "Günnewig Uebachs" en lugar de "Günnewig Uebachs" (con un espacio como primer personaje)

Bonito extra -> no hay necesidad de archivos JAR adicionales en la carpeta lib para que pueda mantener su peso ligero.


También puedes usar java.util.ArrayDeque

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


usando un método auxiliar simple, pero genérico, como este:

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

puedes reescribir:

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

como:

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


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

Ahora lastString tiene el valor "directory"