2009-07-25 14 views
92

J'utilise la méthode split et je veux avoir le dernier élément. La taille du tableau peut changer.Java: Récupère le dernier élément après le split

Exemple:

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

Je veux diviser les chaînes ci-dessus et obtenir le dernier élément:

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

Je ne sais pas la taille des tableaux à l'exécution :(

+1

Au lieu de cela, vous pouvez utiliser la sous-chaîne et l'index. –

+0

@SurendarKannan La réponse la plus écoutée en a un exemple, avec lastIndexOf. –

Répondre

137

Enregistrez le tableau dans une variable locale et utilisez le champ length du tableau pour rechercher sa longueur. d:

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

Sachez simplement que dans le cas où la chaîne d'entrée est vide, la seconde instruction lancera une exception "index out of bounds". –

+3

non, de vous séparer une chaîne vide, il retournera un tableau contenant un élément qui est la chaîne vide elle-même. – Panthro

3

Vous voulez dire que vous ne connaissez pas la taille des tableaux au moment de la compilation? Au moment de l'exécution, ils pouvaient être trouvés par la valeur de lastone.length et lastwo.length.

188

Ou vous pouvez utiliser la méthode lastIndexOf() sur chaîne

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

Je pense que cette solution prend moins de ressources. – ufk

+0

Cela ne lancera-t-il pas 'IndexOutOfBoundsException' si' string' ne contient pas ''-''? –

+4

Non, @JaredBeck, ce n'est pas le cas. Mais il renvoie la chaîne entière, ce qui peut être ou ne pas vouloir vous voulez. Peut-être vaut-il mieux vérifier que le caractère que vous découpez existe en premier dans la chaîne. –

21

à l'aide d'un simple, mais générique, méthode aide comme ceci:

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

vous pouvez réécrire:

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

comme :

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

Une chose que vous devriez faire est de protéger la méthode last() contre les tableaux vides ou vous pourriez obtenir IndexOutOfBoundsException. –

+0

@dotsid, D'autre part, il peut être préférable de lancer une exception ArrayIndexOutOfBoundsException plutôt que de renvoyer null ici, car vous remarquerez l'erreur là où elle se produit plutôt que lorsqu'elle cause le problème. –

+1

@dotsid, je laisserais cette responsabilité à l'appelant, cacher les exceptions d'exécution est dangereux – dfa

5

Depuis qu'il demandait de le faire dans la même ligne à l'aide divisée donc je suggère ceci:

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

J'évite toujours de définir de nouvelles variables pour autant que je peux, et je trouve un très bon pratique

+0

Mais cela jettera un 'IndexOutOfBoundsException' si la chaîne ne contient pas' -' – Stoinov

+0

@Stoinov, en fait il ne le sera pas. vous pouvez le tester! ;) – azerafati

+0

vous pouvez le tester ici !! http://ideone.com/or83Mg – azerafati

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

maintenant lastString a la valeur "directory"

6

Avec 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

Vous pouvez utiliser la classe StringUtils dans Apache Commons:

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

Je suppose que vous voulez faire cette ligne i.Il est possible (un peu de jonglage bien = ^)

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

tadaa, une ligne -> le résultat que vous voulez (si vous divisez sur « - » (espace espace moins) au lieu de seulement « - » (moins) vous perdrez aussi l'espace ennuyeux devant la partition = ^) donc "Günnewig Uebachs" au lieu de "Günnewig Uebachs" (avec un espace comme premier caractère)

Nice extra -> pas besoin de fichiers JAR supplémentaires dans la lib dossier afin que vous puissiez garder votre application poids léger.

0

Aussi, vous pouvez utiliser 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

Réunis tous les moyens possibles ensemble !!


En utilisant lastIndexOf() & substring() méthodes 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. Divise le texte fourni en tableau.

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

Java 8 séquentiel commandé stream d'un tableau.

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: bibliothèques Google Core pour 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 for the Java Platform «Exécuter Javascript est désactivé sur la machine virtuelle Java avec Rhino/Nashorn

  • Rhino« Rhino est une implémentation open-source de JavaScript entièrement écrit en Java. Il est généralement intégré aux applications Java pour fournir des scripts aux utilisateurs finaux. Il est intégré dans J2SE 6 en tant que moteur de script Java par défaut.

  • Nashorn est un moteur JavaScript développé dans le langage de programmation Java par Oracle. Il est basé sur le Da Vinci Machine et a été libéré avec Java 8.

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

fichier 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); } 
Questions connexes