জাভা: বিভাজনের পরে শেষ উপাদান পান


133

আমি স্ট্রিং বিভক্ত পদ্ধতিটি ব্যবহার করছি এবং আমি শেষ উপাদানটি পেতে চাই। অ্যারের আকার পরিবর্তন করতে পারে।

উদাহরণ:

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

আমি উপরের স্ট্রিংগুলিকে বিভক্ত করতে এবং শেষ আইটেমটি পেতে চাই:

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

রানটাইমের সময় অ্যারেগুলির আকারগুলি আমি জানি না :(


1
এর পরিবর্তে আপনি সাবস্ট্রিং এবং সূচিপত্র ব্যবহার করতে পারেন।
সুরেন্ধেরান

@ সুরেন্দারকানান শীর্ষ ভোট প্রাপ্ত উত্তরের লাস্ট ইন্ডেক্সঅফের সাথে এর উদাহরণ রয়েছে।
অ্যাডাম জেনসেন

উত্তর:


173

স্থানীয় পরিবর্তনশীলে অ্যারে সংরক্ষণ করুন এবং lengthএর দৈর্ঘ্য সন্ধান করতে অ্যারের ক্ষেত্রটি ব্যবহার করুন । একে 0-ভিত্তিক হওয়ার জন্য অ্যাকাউন্টে বিয়োগ করুন:

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

ক্যাভেট এমপোটার: যদি মূল স্ট্রিংটি কেবল বিভাজকের সমন্বয়ে গঠিত হয়, উদাহরণস্বরূপ "-"বা "---", bits.length0 হবে এবং এটি একটি অ্যারেআইন্ডেক্সআউটআউটবাউন্ডসেক্সপশন নিক্ষেপ করবে। উদাহরণ: https://onlinegdb.com/r1M-TJkZ8


27
কেবল সচেতন থাকুন যে ক্ষেত্রে ইনপুট স্ট্রিংটি খালি রয়েছে, দ্বিতীয় বিবৃতিটি "সীমা ছাড়িয়ে ইনডেক্স" ব্যতিক্রম করবে।
স্টিফেন সি

7
না তা না, আপনি একটি খালি স্ট্রিং বিভক্ত করে এটি একটি উপাদান যুক্ত করে এমন একটি অ্যারে প্রদান করবে যা খালি স্ট্রিং নিজেই।
পান্থরো

যদি মূল স্ট্রিংটি কেবল বিভাজকের সমন্বয়ে গঠিত হয়, উদাহরণস্বরূপ "-"বা "---", bits.length0 হবে এবং এটি একটি অ্যারেআইন্ডেক্সআউটআউটবাউন্ডসেক্সপশন নিক্ষেপ করবে। উদাহরণ: onlinegdb.com/r1M-TJkZ8
দারিও

: একটি সমাধান ArrayIndexOutOfBoundsException নিক্ষেপ করেন না ডেনিস Bazhenov উত্তর দেখার stackoverflow.com/a/1181976/4249576
দারিও

250

অথবা আপনি স্ট্রিংয়ের lastIndexOf()পদ্ধতি ব্যবহার করতে পারেন

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

16
আমি মনে করি এই সমাধানটি কম সংস্থান গ্রহণ করে।
ufk

এই একটি নিক্ষেপ করবে না IndexOutOfBoundsExceptionযদি stringথাকে না '-'?
জ্যারেড বেক

6
না, @ জারেডবেক, এটি হয় না। তবে এটি পুরো স্ট্রিংটি ফিরিয়ে দেয়, যা আপনি চাইবেন বা নাও করতে পারেন। আপনি যে চরিত্রটি বিভক্ত করছেন সেটির স্ট্রিংটিতে প্রথমে উপস্থিত রয়েছে তা যাচাই করা আরও ভাল।
james.garriss

1
কিন্তু যে একটি নিক্ষেপ করা হবে IndexOutOfBoundsExceptionযদি stringরয়েছে '-'গত অবস্থানে
damgad

8
@ দমগাদ, এটি হবে না। সর্বশেষপরিচয়টি স্ট্রিংয়ের দৈর্ঘ্য হবে - ১। সুতরাং, আপনি খালি স্ট্রিংয়ের সাথে শেষ করবেন
ডেনিস বাজনোভ


23

এর মতো একটি সাধারণ, তবু জেনেরিক, সহায়ক সহায়ক পদ্ধতি ব্যবহার করে:

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

আপনি আবার লিখতে পারেন:

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

যেমন:

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

3
আপনার যা করা উচিত তা হ'ল খালি অ্যারেগুলির বিরুদ্ধে সর্বশেষ () পদ্ধতিটি রক্ষা করা বা আপনি সূচিপত্র ছাড়াই পেতে পারেন x
ডেনিস বাজনোভ

@ ডটসিড, অন্যদিকে এখানে নালাগুলির চেয়ে একটি অ্যারেআইন্ডেক্সআউট অফফাউন্ডসএক্সসেপশন নিক্ষেপ করা ভাল, কারণ সমস্যাটি দেখা দেওয়ার পরিবর্তে আপনি যেখানে ত্রুটিটি ঘটবে সেখানেই ধরবেন।
এমিল এইচ

1
@ ডটসিড, আমি এই দায়িত্ব কলারের কাছে ছেড়ে দেব, রানটাইম ব্যতিক্রমগুলি লুকানো বিপদজনক
ডিএফএ

খুব সুন্দর, এবং অবশ্যই first()এবং nth(T[array], int n)এ থেকে খুব সুন্দরভাবে তৈরি করা হয়েছে।
পিটার আজতাই

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

এখন lastStringমান আছে"directory"



7

একসাথে সমস্ত সম্ভাব্য উপায়ে একত্রিত !!


এর lastIndexOf()& substring()পদ্ধতি ব্যবহার করে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()জাভা এসই 1.4 । সরবরাহিত পাঠ্যকে একটি অ্যারেতে বিভক্ত করে।

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

জাভা 8 ক্রমিক ক্রমযুক্ত একটি অ্যারের থেকে স্ট্রিম

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

অ্যাপাচি কমন্স ল্যাং জার «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: জাভার জন্য গুগল কোর লাইব্রেরি। । 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);

জাভা প্ল্যাটফর্মের জন্য স্ক্রিপ্টিং R গেন্ডো / ন্যাশর্নের সাহায্যে জাভিএম-তে জাভাস্ক্রিপ্ট চালান

  • রাইনো «গণ্ডার সম্পূর্ণ জাভাতে লিখিত জাভাস্ক্রিপ্টের একটি মুক্ত উত্স বাস্তবায়ন। এটি সাধারণত ব্যবহারকারীদের স্ক্রিপ্টিং সরবরাহ করতে জাভা অ্যাপ্লিকেশনগুলিতে এম্বেড থাকে। এটি J2SE 6 এ ডিফল্ট জাভা স্ক্রিপ্টিং ইঞ্জিন হিসাবে এমবেড করা আছে।

  • ন্যাশর্ন একটি জাভাস্ক্রিপ্ট ইঞ্জিন যা ওরাকল দ্বারা জাভা প্রোগ্রামিং ভাষায় নির্মিত। এটি দা ভিঞ্চি মেশিন ভিত্তিক এবং জাভা 8 সহ প্রকাশ করা হয়েছে।

জাভা স্ক্রিপ্টিং প্রোগ্রামার গাইড

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

জাভাস্ক্রিপ্ট ফাইল « 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); }

জাভা 8 স্ট্রিম উদাহরণ ব্যবহার করার সময় মনোযোগ দিন। যদি আপনি স্থান ("") দ্বারা এর মতো একটি স্ট্রিং বিভক্ত হন: Basic (সেখানে একটি পিছনের স্থান রয়েছে), আপনি Basicশেষ উপাদান হিসাবে পাবেন ।
বেলগোরোস

5

যেহেতু তিনি বিভাজন ব্যবহার করে একই লাইনে এটি সব করতে বলছিলেন তাই আমি এটি প্রস্তাব করি:

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

আমি যতদূর পারি নতুন ভেরিয়েবল সংজ্ঞায়িত করা এড়িয়ে চলি এবং আমি এটি একটি খুব ভাল অনুশীলন বলে মনে করি


তবে IndexOutOfBoundsExceptionএতে স্ট্রিং না থাকলে এমন একটি নিক্ষেপ করবে-
স্টাইনভ

@ স্টিনভ, আসলে তা হবে না। আপনি এটি পরীক্ষা করতে পারেন! ;)
আজেফেরতি

1
এটি দু'বার বিভক্ত হয়ে যায় এবং কখনও কখনও খুব ধীর হতে পারে। সুতরাং এটি স্টোরেজটির জন্য বাণিজ্যের গতির স্বীকৃত উত্তরের বিকল্প।
পলজ

@ পলজ্যাং হ্যাঁ এটি ঠিক, যদিও বিভক্তিটি নিজেই খুব দ্রুত, তবে
ওপির

3

আপনার অর্থ আপনি সংকলন-সময় অ্যারেগুলির আকারগুলি জানেন না? রান সময়ে তারা মান দ্বারা পাওয়া যেতে পারে lastone.lengthএবং lastwo.length



1

আমার ধারণা আপনি এই লাইনে এটি করতে চান এটি সম্ভব (কিছুটা জাগল যদিও = ^)

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

তদা, একটি লাইন -> ফলাফলটি আপনি চান (যদি আপনি "-" বিভক্ত হন (স্পেস বিয়োগ স্পেস) কেবল "-" (বিয়োগের পরিবর্তে) আপনি বিভাজনের আগে বিরক্তিকর স্থানটি খুব ফাঁকা করে ফেলবেন = ^) সুতরাং "Günnewig Uebachs" "Gnennewig Uebachs" এর পরিবর্তে (প্রথম চরিত্র হিসাবে একটি স্থান সহ)

দুর্দান্ত অতিরিক্ত -> লাইব ফোল্ডারে অতিরিক্ত জেআর ফাইলের প্রয়োজন নেই যাতে আপনি নিজের অ্যাপ্লিকেশনটিকে হালকা ওজন রাখতে পারেন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.