একটি খালি স্ট্রিংয়ের উপর বিভক্ত আকারের অ্যারে 1:
scala> "".split(',')
res1: Array[String] = Array("")
বিবেচনা করুন যে এটি খালি অ্যারে প্রদান করে:
scala> ",,,,".split(',')
res2: Array[String] = Array()
দয়া করে ব্যাখ্যা করুন :)
একটি খালি স্ট্রিংয়ের উপর বিভক্ত আকারের অ্যারে 1:
scala> "".split(',')
res1: Array[String] = Array("")
বিবেচনা করুন যে এটি খালি অ্যারে প্রদান করে:
scala> ",,,,".split(',')
res2: Array[String] = Array()
দয়া করে ব্যাখ্যা করুন :)
উত্তর:
একই কারণে যে
",test" split ','
এবং
",test," split ','
আকারের একটি অ্যারে ফিরে আসবে 2. প্রথম ম্যাচের প্রথম উপাদান হিসাবে ফিরে আসার আগে সমস্ত কিছু।
"".split("wtf").length0 ফিরে আসে Only কেবল জেএসে এটি 1.: /
"," split ","0 এর অ্যারে কেন দেয়?
যদি আপনি কমলা শূন্য বার বিভক্ত করেন তবে আপনার ঠিক এক টুকরো রয়েছে - কমলা।
"orange".split(','), তবে খালি স্ট্রিংগুলি বিভক্ত করার জন্য স্পষ্টতই প্রাসঙ্গিক নয়। আমি যদি আমার কমলার অভাব শূন্য বারে বিভক্ত করি তবে আমার এখনও কমলা নেই; আমরা কী নো-কমলালেগের খালি তালিকা হিসাবে, একেবারে নো-কমলার তালিকা, বারো নো-কমলার তালিকা, বা কী হিসাবে প্রতিনিধিত্ব করি? এটি আমরা কী দিয়ে শেষ করব তা নয়, তবে আমরা কীভাবে এটি উপস্থাপন করি।
জাভা এবং স্কালাল বিভাজন পদ্ধতিগুলি দুটি ধাপে এইভাবে কাজ করে:
",,,".split(",")খালি অ্যারে ফিরে আসে।এই অনুসারে, ফলাফলটি "".split(",")দ্বিতীয় ধাপের কারণে খালি অ্যারে হওয়া উচিত, তাই না?
এটা করা উচিত। দুর্ভাগ্যক্রমে, এটি একটি কৃত্রিমভাবে চালু কর্নার কেস। এবং এটি খারাপ, তবে কমপক্ষে এটি নথিভুক্ত করা হয়েছে java.util.regex.Pattern, যদি আপনি ডকুমেন্টেশনটি একবার দেখে নিতে ভুলবেন না:
N == 0 এর জন্য, ফলাফলটি <n 0 হিসাবে রয়েছে, খালি স্ট্রিংগুলি অনুসরণ করা ব্যতীত আর ফিরে আসবে না। (নোট করুন যে ক্ষেত্রে উল্লিখিত হিসাবে ইনপুট নিজেই খালি স্ট্রিং বিশেষ, এবং সীমা পরামিতি সেখানে প্রয়োগ হয় না))
সুতরাং, আমি আপনাকে সর্বদা n == -1দ্বিতীয় প্যারামিটার হিসাবে পাস করার পরামর্শ দিই (এটি উপরের দুটি ধাপটি এড়িয়ে যাবে) আপনি যদি নির্দিষ্টভাবে জানেন না আপনি কী অর্জন করতে চান / আপনি নিশ্চিত না যে খালি স্ট্রিং এমন কিছু নয় যা আপনার প্রোগ্রামটি একটি ইনপুট হিসাবে পাবে।
আপনি যদি ইতিমধ্যে আপনার প্রকল্পে পেয়ারা ব্যবহার করছেন তবে আপনি স্প্লিটার (ডকুমেন্টেশন) ক্লাস ব্যবহার করতে পারেন । এটির একটি খুব সমৃদ্ধ এপিআই রয়েছে এবং এটি আপনার কোডটিকে বুঝতে খুব সহজ করে তোলে।
Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"
"".split (",", n)ওরাকল জেডিকে ৮ এর সাথে (-1, 0, 1) এ n এর জন্য একটি উপাদান অ্যারের উত্পন্ন করে 8 কেবল খালি খালি টোকেনের একটি তালিকা পেয়ে ভাল লাগবে - অনুমান করুন একটি সম্পূর্ণ রেজেক্স প্রয়োজনীয় হতে পারে (এর মতো কিছু "[^,\\s]+[^,]*[^,\\s]*")।
খালি স্ট্রিংকে বিভক্ত করা খালি স্ট্রিংটিকে প্রথম উপাদান হিসাবে ফিরিয়ে দেয়। যদি লক্ষ্য স্ট্রিংয়ে কোনও ডিলিমিটার না পাওয়া যায় তবে আপনি মাপের 1 টি অ্যারে পাবেন যা মূল স্ট্রিংটি ধারণ করে আছে, এমনকি এটি খালি রয়েছে।
",".split(",")খালি অ্যারে ফেরত দেয়।
"a".split(",")-> "a"
তাই
"".split(",")->""
",".split(",")খালি অ্যারে ফেরত দেয়।
সমস্ত প্রোগ্রামিং ভাষায় আমি জানি একটি ফাঁকা স্ট্রিং এখনও একটি বৈধ স্ট্রিং। সুতরাং যে কোনও ডিলিমিটার ব্যবহার করে বিভাজন করা সর্বদা একক উপাদান অ্যারে ফিরে আসবে যেখানে সেই উপাদানটি ফাঁকা স্ট্রিং। এটি যদি নাল (ফাঁকা নয়) স্ট্রিং হয় তবে তা অন্যরকম সমস্যা হবে।
এই splitআচরণটি জাভা থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, আরও খারাপ বা খারাপ ...
স্ক্যালালটি Stringআদিম থেকে সংজ্ঞাটি ওভাররাইড করে না ।
দ্রষ্টব্য, আপনি আচরণটি সংশোধন করতে যুক্তিটি ব্যবহারlimit করতে পারেন :
সীমা পরামিতি প্যাটার্নটি প্রয়োগ হওয়ার সময়টিকে নিয়ন্ত্রণ করে এবং ফলস্বরূপ অ্যারের দৈর্ঘ্যকে প্রভাবিত করে। সীমা n যদি শূন্যের চেয়ে বেশি হয় তবে প্যাটার্নটি সর্বাধিক n - 1 বার প্রয়োগ করা হবে, অ্যারের দৈর্ঘ্য n এর চেয়ে বেশি হবে না এবং অ্যারের শেষ এন্ট্রিতে শেষ মিলিত ডিলিমিটারের বাইরে সমস্ত ইনপুট থাকবে। যদি এনটি ইতিবাচক হয় তবে প্যাটার্নটি যতবার সম্ভব প্রয়োগ করা হবে এবং অ্যারের কোনও দৈর্ঘ্য থাকতে পারে। যদি এন শূন্য হয় তবে প্যাটার্নটি যতবার সম্ভব প্রয়োগ করা হবে, অ্যারের যে কোনও দৈর্ঘ্য থাকতে পারে এবং খালি স্ট্রিংগুলি অনুসরণ করে বাতিল করা হবে।
অর্থাৎ আপনি limit=-1অন্যান্য ভাষার (সকল?) আচরণ পেতে সেট করতে পারেন :
@ ",a,,b,,".split(",")
res1: Array[String] = Array("", "a", "", "b")
@ ",a,,b,,".split(",", -1) // limit=-1
res2: Array[String] = Array("", "a", "", "b", "", "")
জাভা আচরণটি বেশ বিভ্রান্তিকর হলেও এটি সুপরিচিত বলে মনে হয় তবে:
উপরের আচরণটি কমপক্ষে জাভা 5 থেকে জাভা 8 পর্যন্ত লক্ষ্য করা যায়।
JDK-6559590 এ একটি ফাঁকা স্ট্রিং বিভক্ত করার সময় একটি শূন্য অ্যারে ফিরিয়ে দেওয়ার জন্য আচরণটি পরিবর্তন করার চেষ্টা করা হয়েছিল । তবে এটি শীঘ্রই JDK-8028321 এ ফিরিয়ে দেওয়া হয়েছিল যখন এটি বিভিন্ন স্থানে রিগ্রেশন সৃষ্টি করে। পরিবর্তনটি এটিকে কখনই প্রাথমিক জাভা 8 রিলিজ করে না।
নোট: বিভক্ত পদ্ধতি শুরু থেকে জাভা ছিল না (এটা 1.0.2 নেই ) কিন্তু আসলে অন্তত 1.4 থেকে আছে (যেমন দেখুন JSR51 2002 প্রায়)। আমি এখনও তদন্ত করছি ...
অস্পষ্ট কারণটি হচ্ছে জাভা কেন প্রথম স্থানে এটি বেছে নিয়েছিল (আমার সন্দেহ হ'ল এটি মূলত "প্রান্তের ক্ষেত্রে" তদারকি / বাগ ছিল) তবে এখন অলঙ্ঘনীয়ভাবে ভাষায় বেক করা হয়েছে এবং তাই এখনও রয়েছে ।
"".split(",")এখনও একটি একক উপাদান অ্যারের মত করে দেয় [""]।
একটি স্ট্রিং বিভক্ত করার সময় খালি স্ট্রিংয়ের কোনও বিশেষ অবস্থান নেই। আপনি ব্যবহার করতে পারেন:
Some(str)
.filter(_ != "")
.map(_.split(","))
.getOrElse(Array())