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
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"