জাভা স্ট্রিং বিভক্ত খালি মান মুছে ফেলা


286

আমি একটি বিভাজক ব্যবহার করে মানটি বিভক্ত করার চেষ্টা করছি। তবে আমি অবাক করা ফলাফল খুঁজে পাচ্ছি

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

আমি 8 মান পেতে আশা করছি। [5,6,7, EMPTY, 8,9, EMPTY, EMPTY] তবে আমি পাচ্ছি মাত্র 6 টি মান।

কোনও ধারণা এবং কীভাবে ঠিক করবেন। EMPTY মান যে কোনও জায়গায় আসুক না কেন, এটি অ্যারেতে হওয়া উচিত।

উত্তর:


492

split(delimiter)ডিফল্টরূপে ফলাফল অ্যারে থেকে ফাঁকা স্ট্রিংগুলি সরিয়ে দেয়। এই প্রক্রিয়াটি বন্ধ করতে আমাদের ওভারলোড হওয়া সংস্করণটি নেগেটিভ মানের মতো সেট split(delimiter, limit)সহ ব্যবহার করতে হবেlimit

String[] split = data.split("\\|", -1);

আরও কিছু বিশদ বিবরণ:
split(regex)অভ্যন্তরীণভাবে এই পদ্ধতির ফলাফল split(regex, 0)এবং ডকুমেন্টেশনে ফলাফলগুলি পাওয়া যাবে (জোর খনি)

limitপরামিতি বার প্যাটার্ন প্রয়োগ করা হয় সংখ্যা নিয়ন্ত্রণ করে এবং সেইজন্য ফলে অ্যারের দৈর্ঘ্য প্রভাবিত করে।

সীমা যদি nহয় শূন্য চেয়ে বড় তারপর প্যাটার্ন সবচেয়ে এন এ প্রয়োগ করা হবে - 1 বার অ্যারে এর দৈর্ঘ্য এন চেয়ে বেশি হবে এবং অ্যারে এর শেষ এন্ট্রি গত মিলেছে বিভেদক পরলোক সমস্ত ইনপুট উপস্থিত থাকবে।

যদি nহয় অ ইতিবাচক তারপর প্যাটার্ন যতটা সম্ভব অনেক বার হিসাবে প্রয়োগ করা হবে এবং অ্যারে যে কোন দৈর্ঘ্যের হতে পারে।

যদি nহয় শূন্য তারপর প্যাটার্ন যতটা সম্ভব অনেক বার হিসাবে প্রয়োগ করা হবে, এরে যে কোন দৈর্ঘ্যের থাকতে পারে, এবং খালি স্ট্রিং trailing পরিত্যাগ করা হবে

ব্যতিক্রম :

এটি উল্লেখ করার মতো যে খালি স্ট্রিংটিকে অনুসরণ করে সরিয়ে ফেলা কেবল তখনই বোধগম্য হয় যদি এই ধরনের খালি স্ট্রিংয়ের জিনিসপত্র বিভাজন প্রক্রিয়া দ্বারা তৈরি করা হয় । সুতরাং "".split(anything)যেহেতু আমরা ""আরও বিভক্ত করতে পারি না আমরা ফলাফল [""]অ্যারে হিসাবে পেতে হবে ।
এটি ঘটেছিল কারণ এখানে বিভাজন ঘটেনি, সুতরাং ""খালি থাকা এবং পেছন থাকা সত্ত্বেও মূল স্ট্রিং উপস্থাপন করে , ফাঁকা স্ট্রিং নয় যা বিভাজন প্রক্রিয়া দ্বারা তৈরি হয়েছিল।


2
কি দারুন. যে উজ্জ্বলভাবে কাজ। কিন্তু -1 কীভাবে এটি সবকিছু বদলে যায়?
রেড্ডি

1
এমনকি আপনি চেষ্টা করতে পারেনdata.split("\\|", 8)
সুভ্রজ্যোতি মজুমদার

23
split("\\|", 8)প্রথম আটটি টোকেনের সীমাবদ্ধতার কারণে এটি ব্যবহার করবেন না ! যদি আপনার স্ট্রিং পরিবর্তনশীল হয় তবে আপনার ব্যবহার করা উচিত split("\\|", -1)যাতে এটি সীমাহীন টোকেন তৈরি করে এবং শেষে খালি টোকেনগুলি ফেলে দেয় না
ADTC

2
@ রেডি -১ ( বা কোনও নেতিবাচক সংখ্যা, এটির পরম মান কী তা বিবেচনাধীন নয় ) খালি টোকেনগুলি শেষে রাখার জন্য বিভক্ত পদ্ধতিটি বলে। ডিফল্টটি 0 হয়, যা অ্যারের শেষে খালি টোকেন ফেলে দেওয়ার পদ্ধতিটি বলে।
এডিটিসি

8
স্পষ্টতই, প্রচুর লোকেরা প্রত্যাশা করেছিলেন যে পিছনটি খালি স্ট্রিংগুলি রাখা ডিফল্ট কার্যকারিতা split(regex)। তারা এখানে এসে জানতে পেরেছিল যে এটি তা নয়।
আটটিলা টানাই

32

এর ডকুমেন্টেশন থেকে String.split(String regex):

এই পদ্ধতিটি যেমন প্রদত্ত অভিব্যক্তি এবং শূন্যের একটি সীমাবদ্ধ যুক্তির সাথে দ্বি-যুক্তির বিভক্ত পদ্ধতিটি অনুরোধ করে কাজ করে। ট্র্যাকিং খালি স্ট্রিংগুলি ফলস্বরূপ অ্যারেতে অন্তর্ভুক্ত নয়।

সুতরাং আপনাকে দুটি আর্গুমেন্ট সংস্করণটি String.split(String regex, int limit)নেতিবাচক মান সহ ব্যবহার করতে হবে :

String[] split = data.split("\\|",-1);

ডক:

যদি সীমা n শূন্যের চেয়ে বেশি হয় তবে প্যাটার্নটি সর্বাধিক n - 1 বার প্রয়োগ করা হবে, অ্যারের দৈর্ঘ্য n এর চেয়ে বেশি হবে না এবং অ্যারের শেষ এন্ট্রিতে শেষ মিলিত ডিলিমিটারের বাইরে সমস্ত ইনপুট থাকবে। যদি এনটি ইতিবাচক হয় তবে প্যাটার্নটি যতবার সম্ভব প্রয়োগ করা হবে এবং অ্যারের যে কোনও দৈর্ঘ্য থাকতে পারে। যদি এন শূন্য হয় তবে প্যাটার্নটি যতবার সম্ভব প্রয়োগ করা হবে, অ্যারের যে কোনও দৈর্ঘ্য থাকতে পারে এবং খালি স্ট্রিংগুলি অনুসরণ করে বাতিল করা হবে।

এটি অনুসরণকারী উপাদানগুলি সহ কোনও খালি উপাদান ছাড়বে না।


4

থেকে String.split () এপিআই ডক :

প্রদত্ত নিয়মিত প্রকাশের ম্যাচের চারপাশে এই স্ট্রিংটি বিভক্ত করে। এই পদ্ধতিটি যেমন প্রদত্ত অভিব্যক্তি এবং শূন্যের একটি সীমাবদ্ধ যুক্তির সাথে দ্বি-যুক্তির বিভক্ত পদ্ধতিটি অনুরোধ করে কাজ করে। ট্র্যাকিং খালি স্ট্রিংগুলি ফলস্বরূপ অ্যারেতে অন্তর্ভুক্ত নয়।

আপনার কেসটির জন্য ওভারলোডেড স্ট্রিং.স্প্লিট (রিজেক্স, ইনট) আরও উপযুক্ত।


1
এটি আচরণটি ব্যাখ্যা করে তবে প্রশ্নের উত্তর দেয় না।
Assylias

@Asslias এটি এখনই আমার উত্তরে যুক্ত করেছে :)
PermGenError

4

String[] split = data.split("\\|",-1);

এটি সব সময় আসল প্রয়োজন নয়। উপরের ড্রবব্যাকটি নীচে দেখানো হয়েছে:

Scenerio 1:
When all data are present:
    String data = "5|6|7||8|9|10|";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 7
    System.out.println(splt.length); //output: 8

যখন ডেটা অনুপস্থিত:

Scenerio 2: Data Missing
    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output: 8

প্রকৃত প্রয়োজনীয়তা দৈর্ঘ্য 7 হওয়া উচিত যদিও ডেটা অনুপস্থিত। কারণ আমার যখন ডাটাবেস বা অন্য কিছু সন্নিবেশ করা দরকার তখন এরকম কেস রয়েছে। আমরা নীচের পদ্ধতির ব্যবহার করে এটি অর্জন করতে পারি।

    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output:7

আমি এখানে যা করেছি তা হ'ল "|" শেষে পাইপ এবং তারপরে স্ট্রিংকে বিভক্ত করুন। আপনার যদি পৃথক হিসাবে "," থাকে তবে আপনার পরিবর্তে সমস্ত "", replace "যুক্ত করতে হবে।


1

হোয়াইটস্পেস অক্ষর, কমা, সেমিকোলন ইত্যাদিসহ আপনার একাধিক বিভাজক থাকতে পারে repeat

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

আপনার 4 টি টোকেন থাকবে - a, b, c, d

উত্স স্ট্রিংয়ের শীর্ষস্থানীয় বিভাজকদের এই বিভাজন প্রয়োগের আগে সরিয়ে ফেলা দরকার।

প্রশ্নের উত্তর হিসাবে জিজ্ঞাসা:

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

আপনার সাথে বিভাজক হিসাবে যদি সেইগুলি থাকে তবে সেক্ষেত্রে সাদা স্পেসগুলি কেবল যুক্ত হয়েছে

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