2009-07-25 16 views
92

Estoy utilizando el método de división de cadenas y quiero tener el último elemento. El tamaño de la matriz puede cambiar.Java: Obtener el último elemento después de dividir

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 :(

+1

En lugar de esto, puede usar subcadena e indexof. –

+0

@SurendarKannan La respuesta más votado tiene un ejemplo de eso, con lastIndexOf. –

Respuesta

137

Guarde la matriz en una variable local y use el campo length de la matriz para encontrar su longitud. Reste uno para tener en cuenta que es 0-base d:

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

Solo tenga en cuenta que en el caso en que la cadena de entrada esté vacía, la segunda instrucción lanzará una excepción de "índice fuera de límites". –

+3

no, de ti dividir una cadena vacía devolverá una matriz que contiene un elemento que es la cadena vacía en sí. – Panthro

3

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

188

O usted podría utilizar lastIndexOf() método de cadena

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

Creo que esta solución requiere menos recursos. – ufk

+0

¿No arrojará esto un 'IndexOutOfBoundsException' si' string' no contiene ''-''? –

+4

No, @JaredBeck, no es así. Pero devuelve toda la cadena, que puede ser deseada o no. Sería mejor verificar que el personaje en el que estás dividiendo exista primero en la cadena. –

21

utilizando un método sencillo, pero genérico, ayudante de la siguiente manera:

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

puede volver a escribir:

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

como :

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

Una cosa que debes hacer es proteger el método last() contra matrices vacías o podrías obtener IndexOutOfBoundsException. –

+0

@dotsid, por otro lado, podría ser mejor lanzar una ArrayIndexOutOfBoundsException en lugar de devolver null aquí, ya que detectará el error donde ocurre más bien cuando causa el problema. –

+1

@dotsid, dejaría esta responsabilidad a la persona que llama, ocultar las excepciones de tiempo de ejecución es peligroso – dfa

5

Desde que estaba pidiendo a hacerlo todo en la misma línea usando dividida por lo que sugiero esto:

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

siempre evito definir nuevas variables en la medida de lo que puedo, y me parece una muy buena la práctica

+0

Pero eso lanzará un 'IndexOutOfBoundsException' si la cadena no contiene' -' – Stoinov

+0

@Stoinov, en realidad no lo hará. ¡puedes probarlo! ;) – azerafati

+0

¡puedes probarlo aquí! http://ideone.com/or83Mg – azerafati

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

Ahora lastString tiene el valor "directory"

6

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

12

Usted puede utilizar la clase StringUtils en Apache Commons:

StringUtils.substringAfterLast(one, "-"); 
0

supongo que quieres hacer esto en línea i.Es posible (un poco de malabarismo aunque = ^)

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

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

Niza extra -> no hay necesidad de archivos JAR adicionales en la lib carpeta para que pueda mantener su aplicación ligera.

0

También puede utilizar java.util.ArrayDeque

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

en Java 8

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

recolectan todas las formas posibles junto !!


Mediante el uso de lastIndexOf() & substring() métodos 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); 

Java 8 secuencial clasificadas stream 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 for Java. «Com.google.common.base.Divisor

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 for the Java Platform «ejecutar JavaScript en la JVM con Rhino/Nashorn

  • Rhino« Rhino es una implementación de código abierto de JavaScript escrito 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 Vinci Da y ha sido puesto en libertad con Java 8.

Java Scripting Programmer's Guide

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); } 
Cuestiones relacionadas