J'utilise la méthode de scission de chaîne et je veux avoir le dernier élément. La taille du tableau peut changer.
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 connais pas la taille des tableaux au moment de l'exécution :(
Enregistrez le tableau dans une variable locale et utilisez le champ length
du tableau pour trouver sa longueur. Soustrayez-en un pour qu'il soit basé sur 0:
String[] bits = one.split("-");
String lastOne = bits[bits.length-1];
Ou vous pouvez utiliser la méthode lastIndexOf()
sur String
String last = string.substring(string.lastIndexOf('-') + 1);
en utilisant une méthode d'assistance simple, mais générique, comme celle-ci:
public static <T> T last(T[] array) {
return array[array.length - 1];
}
vous pouvez réécrire:
lastone = one.split("-")[..];
comme:
lastone = last(one.split("-"));
Vous pouvez utiliser la classe StringUtils dans Apache Commons:
StringUtils.substringAfterLast(one, "-");
String str = "www.anywebsite.com/folder/subfolder/directory";
int index = str.lastIndexOf('/');
String lastString = str.substring(index +1);
Maintenant, lastString
a la valeur "directory"
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 un tableau.
String[] split = str.split( Pattern.quote( separator ) );
String lastOne = split[split.length-1];
System.out.println("Split Array : "+ lastOne);
Java 8 séquentiel ordonné flux à partir 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 Langpot " 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 pour la Java Platform "Lancer Javascript sur la machine virtuelle 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 afin de fournir des scripts aux utilisateurs finaux. Il est intégré à J2SE 6 en tant que moteur de script par défaut Java.
Nashorn est un moteur JavaScript développé dans le langage de programmation Java par Oracle. Il est basé sur la machine Da Vinci et a été publié avec Java 8.
Java Scripting Guide du programmeur
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); }
Puisqu'il demandait de tout faire dans la même ligne en utilisant split, je suggère ceci:
lastone = one.split("-")[(one.split("-")).length -1]
J'évite toujours de définir de nouvelles variables autant que je peux, et je trouve que c'est une très bonne pratique
Vous voulez dire que vous ne connaissez pas la taille des tableaux lors de la compilation? Au moment de l'exécution, ils pourraient être trouvés par la valeur de lastone.length
et lastwo.length
.
Dans Java 8
String lastItem = Stream.of(str.split("-")).reduce((first,last)->last).get();
Je suppose que vous voulez faire cela en ligne. C'est possible (un peu de jongler si = ^)
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 vous séparez sur "-" (espace moins espace) au lieu de seulement "-" (moins), vous perdrez aussi l'espace ennuyeux avant la partition = ^), donc "Günnewig Uebachs" au lieu de "Günnewig Uebachs" (avec un espace comme premier caractère)
Extra sympa -> pas besoin de fichiers JAR supplémentaires dans le dossier lib pour garder votre application légère.
Aussi, vous pouvez utiliser Java.util.ArrayDeque
String last = new ArrayDeque<>(Arrays.asList("1-2".split("-"))).getLast();