web-dev-qa-db-fra.com

Java: Obtenir le dernier élément après la scission

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

117
n00ki3

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];
160
Jon Skeet

Ou vous pouvez utiliser la méthode lastIndexOf() sur String

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

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("-"));
23
dfa

Vous pouvez utiliser la classe StringUtils dans Apache Commons:

StringUtils.substringAfterLast(one, "-");
22
Ranosama
String str = "www.anywebsite.com/folder/subfolder/directory";
int index = str.lastIndexOf('/');
String lastString = str.substring(index +1);

Maintenant, lastString a la valeur "directory"

10
Xar E Ahmer

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

Avec goyave :

final Splitter splitter = Splitter.on("-").trimResults();
assertEquals("Günnewig Uebachs", Iterables.getLast(splitter.split(one)));
assertEquals("Madison", Iterables.getLast(splitter.split(two)));

Splitter , Iterables

6
palacsint

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

5
azerafati

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.

3
Sean A.O. Harney

Dans Java 8

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

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.

0
irJvV

Aussi, vous pouvez utiliser Java.util.ArrayDeque

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