কেন একটি ফাঁকা স্ট্রিংয়ের "স্প্লিট" খালি শূন্য অ্যারে ফেরত দেয়?


111

একটি খালি স্ট্রিংয়ের উপর বিভক্ত আকারের অ্যারে 1:

scala> "".split(',')
res1: Array[String] = Array("")

বিবেচনা করুন যে এটি খালি অ্যারে প্রদান করে:

scala> ",,,,".split(',')
res2: Array[String] = Array()

দয়া করে ব্যাখ্যা করুন :)


5
অতিরিক্তভাবে, স্ট্রিংটিতে বিভাজকের কেবলমাত্র একটি উদাহরণ উপস্থিত থাকলে এটি পর্যবেক্ষণের আচরণের সাথে বেমানান বলে মনে হয়। এই ক্ষেত্রে ফলাফল কার্যকরভাবে একটি খালি অ্যারে: ","। বিভক্ত (",") দৈর্ঘ্য == 0
এলডি।

উত্তর:


37

একই কারণে যে

",test" split ','

এবং

",test," split ','

আকারের একটি অ্যারে ফিরে আসবে 2. প্রথম ম্যাচের প্রথম উপাদান হিসাবে ফিরে আসার আগে সমস্ত কিছু।


5
খালি স্ট্রিং একটি স্ট্রিং, কিছুই নয়। (অন্য কোথাও তবে এক্সেলের মধ্যে)
রাফেল

5
@ রাফেল বা কোনও ওরাকল ডাটাবেসে
অস্টিন

7
@ রাফেল, অন্য কোনও প্রোগ্রামিংয়ের ভাষাতে "".split("wtf").length0 ফিরে আসে Only কেবল জেএসে এটি 1.: /
আন্দ্রে মিখায়লভ - লোলমাস

11
@ ড্যানিয়েলসি.সোব্রাল ঠিক আছে, তাহলে "," split ","0 এর অ্যারে কেন দেয়?
জোয়ান

5
শেষ ম্যাচের পরে সবকিছু কেন ফিরে আসেনি?
দিদিয়ার এ।

72

যদি আপনি কমলা শূন্য বার বিভক্ত করেন তবে আপনার ঠিক এক টুকরো রয়েছে - কমলা।


8
তবে কমলা খালি নেই (আইডকি যদি ওলুই বলতে বোঝায়) এটি একটি কমলা। সম্ভবত একটি কমলা বিভক্ত করা উচিত যা সেখানে হওয়া উচিত, তবে তা নয়, তাই আপনি একক মান ফিরে পাবেন: একটি খালি স্থান এক্সডি
নিক রোল্যান্ডো

8
এটি একটি গভীর আলাপ।

31
এই রূপকটি অর্থবোধ করে "orange".split(','), তবে খালি স্ট্রিংগুলি বিভক্ত করার জন্য স্পষ্টতই প্রাসঙ্গিক নয়। আমি যদি আমার কমলার অভাব শূন্য বারে বিভক্ত করি তবে আমার এখনও কমলা নেই; আমরা কী নো-কমলালেগের খালি তালিকা হিসাবে, একেবারে নো-কমলার তালিকা, বারো নো-কমলার তালিকা, বা কী হিসাবে প্রতিনিধিত্ব করি? এটি আমরা কী দিয়ে শেষ করব তা নয়, তবে আমরা কীভাবে এটি উপস্থাপন করি।
ম্যাচু

1
তবে আপনি যদি কোনও অস্তিত্বের বইয়ের পৃষ্ঠাগুলি দ্বারা বিভক্ত করেন তবে আপনি কিছুই পাবেন না।
এসএমইউসামশাহ

49

জাভা এবং স্কালাল বিভাজন পদ্ধতিগুলি দুটি ধাপে এইভাবে কাজ করে:

  • প্রথমে ডিলিমিটার দিয়ে স্ট্রিং বিভক্ত করুন। প্রাকৃতিক পরিণতি হ'ল যদি স্ট্রিংটিতে ডিলিমিটার না থাকে তবে কেবল ইনপুট স্ট্রিং সহ একটি সিঙ্গলটন অ্যারে ফিরে আসে,
  • দ্বিতীয়ত, সমস্ত ডানদিকের খালি স্ট্রিংগুলি সরান। এই কারণেই ",,,".split(",")খালি অ্যারে ফিরে আসে।

এই অনুসারে, ফলাফলটি "".split(",")দ্বিতীয় ধাপের কারণে খালি অ্যারে হওয়া উচিত, তাই না?

এটা করা উচিত। দুর্ভাগ্যক্রমে, এটি একটি কৃত্রিমভাবে চালু কর্নার কেস। এবং এটি খারাপ, তবে কমপক্ষে এটি নথিভুক্ত করা হয়েছে java.util.regex.Pattern, যদি আপনি ডকুমেন্টেশনটি একবার দেখে নিতে ভুলবেন না:

N == 0 এর জন্য, ফলাফলটি <n 0 হিসাবে রয়েছে, খালি স্ট্রিংগুলি অনুসরণ করা ব্যতীত আর ফিরে আসবে না। (নোট করুন যে ক্ষেত্রে উল্লিখিত হিসাবে ইনপুট নিজেই খালি স্ট্রিং বিশেষ, এবং সীমা পরামিতি সেখানে প্রয়োগ হয় না))

সমাধান 1: সর্বদা দ্বিতীয় প্যারামিটার হিসাবে -1 পাস করুন

সুতরাং, আমি আপনাকে সর্বদা n == -1দ্বিতীয় প্যারামিটার হিসাবে পাস করার পরামর্শ দিই (এটি উপরের দুটি ধাপটি এড়িয়ে যাবে) আপনি যদি নির্দিষ্টভাবে জানেন না আপনি কী অর্জন করতে চান / আপনি নিশ্চিত না যে খালি স্ট্রিং এমন কিছু নয় যা আপনার প্রোগ্রামটি একটি ইনপুট হিসাবে পাবে।

সমাধান 2: পেয়ারা বিভাজন ক্লাস ব্যবহার করুন

আপনি যদি ইতিমধ্যে আপনার প্রকল্পে পেয়ারা ব্যবহার করছেন তবে আপনি স্প্লিটার (ডকুমেন্টেশন) ক্লাস ব্যবহার করতে পারেন । এটির একটি খুব সমৃদ্ধ এপিআই রয়েছে এবং এটি আপনার কোডটিকে বুঝতে খুব সহজ করে তোলে।

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"

1
+1, এটিই একমাত্র উত্তর যা ডকুমেন্টেশনের প্রকৃতপক্ষে উদ্ধৃত করে এবং উল্লেখ করে যে এটি বেমানান। যাইহোক, আমি আমার জাভাডকে মন্তব্যটির হাইলাইট অংশটি পাইনি।
যোগু

আমি এটি java.util.regex.Pattern এ পেয়েছি, তবে এটি বেশিরভাগই শেষ হয়ে গেছে বলে মনে হচ্ছে। লেখার সময়, এটি অবশ্যই জাভাদোক হিসাবে সরকারী ওপেনজেডিকে উত্স ট্রিতে উপস্থিত ছিল। android.googlesource.com/platform/libcore/+/… হয়তো আমাদের কোনও বাগ রিপোর্ট করা উচিত?
রোক ক্রালজ

একটি বাগ রিপোর্ট করার জন্য একটি ভাল ধারণা হবে - আচরণটি অবশ্যই পরিবর্তিত হবে না, তবে এটি অন্তত নথিভুক্ত করা উচিত।
যোগু

@ রোকক্রালজ অ্যান্ড্রয়েড ওপেনজেডিকে পাঠাগারটি ব্যবহার করেনি, তবে পরিবর্তে এটি অ্যাপাচি হারমোনি ভিত্তিক ছিল, সুতরাং আপনি কি ভুল জায়গায় খুঁজছেন?
lxgr

1
"".split (",", n)ওরাকল জেডিকে ৮ এর সাথে (-1, 0, 1) এ n এর জন্য একটি উপাদান অ্যারের উত্পন্ন করে 8 কেবল খালি খালি টোকেনের একটি তালিকা পেয়ে ভাল লাগবে - অনুমান করুন একটি সম্পূর্ণ রেজেক্স প্রয়োজনীয় হতে পারে (এর মতো কিছু "[^,\\s]+[^,]*[^,\\s]*")।
সাইমন.ওয়াটস

40

খালি স্ট্রিংকে বিভক্ত করা খালি স্ট্রিংটিকে প্রথম উপাদান হিসাবে ফিরিয়ে দেয়। যদি লক্ষ্য স্ট্রিংয়ে কোনও ডিলিমিটার না পাওয়া যায় তবে আপনি মাপের 1 টি অ্যারে পাবেন যা মূল স্ট্রিংটি ধারণ করে আছে, এমনকি এটি খালি রয়েছে।


2
ভুল। স্প্লিট সমস্ত ডানদিকের খালি স্ট্রিংগুলি সরিয়ে দেয়, ফলস্বরূপ ফলাফলটি খালি অ্যারে হওয়া উচিত। আমার উত্তর দেখুন। ",".split(",")খালি অ্যারে ফেরত দেয়।
রোক ক্রালজ

23

"a".split(",")-> "a" তাই "".split(",")->""


6
ভুল। স্প্লিট সমস্ত ডানদিকের খালি স্ট্রিংগুলি সরিয়ে দেয়, ফলস্বরূপ ফলাফলটি খালি অ্যারে হওয়া উচিত। আমার উত্তর দেখুন। ",".split(",")খালি অ্যারে ফেরত দেয়।
রোক ক্রালজ

5

সমস্ত প্রোগ্রামিং ভাষায় আমি জানি একটি ফাঁকা স্ট্রিং এখনও একটি বৈধ স্ট্রিং। সুতরাং যে কোনও ডিলিমিটার ব্যবহার করে বিভাজন করা সর্বদা একক উপাদান অ্যারে ফিরে আসবে যেখানে সেই উপাদানটি ফাঁকা স্ট্রিং। এটি যদি নাল (ফাঁকা নয়) স্ট্রিং হয় তবে তা অন্যরকম সমস্যা হবে।


আমি মনে করি এটি একটি লাইব্রেরি ফাংশন এবং ভাষার অংশ নয়। উদাহরণস্বরূপ গুগল পেয়ারাতে আপনি খালি স্ট্রিং বাদ দিতে পারেন। > পরিবেশনযোগ্য <স্ট্রিং> টুকরা = com.google.common.base.Splitter.on (',')। ItitEmptyStrings ()। বিভক্ত ("");
অলিউজ

2

এই 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(",")এখনও একটি একক উপাদান অ্যারের মত করে দেয় [""]
ডেভিড্যাভ ডেভ

@ ডেভিড্যাভ ডেভ যা প্রতিটি অন্যান্য ভাষার প্রত্যাশিত আচরণ। ",,,," হ'ল স্কালার উদ্ভট / ভিন্ন আচরণ এবং "" কেসের ক্ষেত্রে ভিন্ন।
অ্যান্ডি হেডেন

0

একটি স্ট্রিং বিভক্ত করার সময় খালি স্ট্রিংয়ের কোনও বিশেষ অবস্থান নেই। আপনি ব্যবহার করতে পারেন:

Some(str)
  .filter(_ != "")
  .map(_.split(","))
  .getOrElse(Array())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.