java - meaning - what is string in c




কিভাবে জাভা একটি স্ট্রিং বিভক্ত (20)

Javadoc এর String ক্লাসে split() পদ্ধতিটি দেখুন।

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

String data = "004-034556-1212-232-232";
int cnt = 1;
for (String item : data.split("-")) {
        System.out.println("string "+cnt+" = "+item);
        cnt++;
}

এখানে বিভক্ত স্ট্রিং জন্য অনেক উদাহরণ কিন্তু আমি সামান্য কোড অপ্টিমাইজ করা।

আমার একটি স্ট্রিং আছে, "004-034556" , যা আমি দুটি স্ট্রিংগুলিতে বিভক্ত করতে চাই:

string1="004";
string2="034556";

এর মানে প্রথম স্ট্রিংটিতে '-' আগে অক্ষর থাকবে, এবং দ্বিতীয় স্ট্রিংটিতে '-' পরে অক্ষর থাকবে। আমি স্ট্রিংটিতে '-' আছে কিনা তা পরীক্ষা করতে চাই। যদি না হয়, আমি একটি ব্যতিক্রম নিক্ষেপ করা হবে। কিভাবে আমি এটি করতে পারব?


অনুগ্রহ করে StringTokenizer ক্লাসটি ব্যবহার করবেন না কারণ এটি একটি লিগ্যাসি ক্লাস যা সামঞ্জস্যের কারণে ধরে রাখা হয় এবং এটির ব্যবহার নতুন কোডে নিরুৎসাহিত করা হয়। এবং আমরা অন্যদের দ্বারা প্রস্তাবিত হিসাবে বিভক্ত পদ্ধতি ব্যবহার করতে পারেন।

String[] sampleTokens = "004-034556".split("-");
System.out.println(Arrays.toString(sampleTokens));

এবং প্রত্যাশিত হিসাবে এটি মুদ্রণ করা হবে:

[004, 034556]

এই উত্তরটিতে আমি জাভা 8 তে split পদ্ধতির জন্য যে একটি পরিবর্তন ঘটেছে তাও নির্দেশ করতে চাই। String#split() পদ্ধতিটি Pattern.split ব্যবহার করে, এবং এখন এটি ফলাফল অ্যারের শুরুতে খালি স্ট্রিংগুলি সরিয়ে দেবে। জাভা 8 এর জন্য ডকুমেন্টেশন এই change লক্ষ্য করুন:

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

এটা নিম্নলিখিত উদাহরণ মানে:

String[] sampleTokensAgain = "004".split("");
System.out.println(Arrays.toString(sampleTokensAgain));

আমরা তিনটি স্ট্রিং পাবেন: [0, 0, 4] এবং চারটি নয় জাভা ক্ষেত্রে 7 এবং তার আগে। এছাড়াও এই অনুরূপ question চেক করুন।


আপনি এই মত চেষ্টা করতে পারেন

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");

আপনি পদ্ধতি বিভক্ত ব্যবহার করতে পারেন

public class Demo {
    public static void main(String args[]){
        String str ="004-034556";
        if((str.contains("-"))){
            String[] temp=str.split("-");
            for(String part:temp){
                System.out.println(part);
            }
        }else{
            System.out.println(str+" does not contain \"-\".");
        }

    }
}

আপনি সত্যিই বিবেচনা করার প্রয়োজন শুধুমাত্র দুটি পদ্ধতি আছে।

স্ট্রিং.split ব্যবহার করুন যদি এক অক্ষর সীমাবদ্ধতা বা আপনি কর্মক্ষমতা সম্পর্কে যত্ন না

পারফরম্যান্স কোনও সমস্যা না থাকলে, অথবা যদি ডিলিমিটার একটি একক চরিত্র যা নিয়মিত অভিব্যক্তি বিশেষ অক্ষর নয় (অর্থাত্ .$|()[{^?*+\ ) এর মধ্যে নয় তবে String.split . String.split ব্যবহার করতে পারেন।

String[] results = input.split(",");

বিভক্ত পদ্ধতিটি যদি নিয়মিত অভিব্যক্তি ব্যবহার করে এড়াতে একটি অপ্টিমাইজেশান থাকে তবে ডিলিমিটারটি একটিও অক্ষর এবং উপরের তালিকায় নয়। অন্যথা, এটি একটি নিয়মিত অভিব্যক্তি কম্পাইল করতে হবে এবং এটি আদর্শ নয়।

প্যাটার্ন.sপ্লিট ব্যবহার করুন এবং যদি জটিল সীমাবদ্ধতা ব্যবহার করে এবং আপনি কর্মক্ষমতা সম্পর্কে যত্নশীল প্যাটার্ন precompile

পারফরম্যান্স একটি সমস্যা এবং আপনার সীমা অতিক্রমকারীর মধ্যে একটি না হলে, আপনি একটি নিয়মিত অভিব্যক্তি প্যাটার্ন প্রাক-কম্পাইল করা উচিত যা আপনি তারপর পুনরায় ব্যবহার করতে পারেন।

// Save this somewhere
Pattern pattern = Pattern.compile("[,;:]");

/// ... later
String[] results = pattern.split(input);

এই শেষ বিকল্পটি এখনও একটি নতুন Matcher অবজেক্ট তৈরি করে। আপনি এই বস্তুর ক্যাশে এবং সর্বাধিক কর্মক্ষমতা জন্য প্রতিটি ইনপুট জন্য এটি পুনরায় সেট করতে পারেন, কিন্তু এটি কিছুটা জটিল এবং থ্রেড-নিরাপদ নয়।


আমি জাভা বিল্ট-ইন ফাংশন ব্যবহার করার পরিবর্তে একটি অ্যালগরিদম লিখতে চেয়েছিলাম:

public static List<String> split(String str, char c){
    List<String> list = new ArrayList<>();
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.length(); i++){
        if(str.charAt(i) != c){
            sb.append(str.charAt(i));
        }
        else{
            if(sb.length() > 0){
                list.add(sb.toString());
                sb = new StringBuilder();
            }
        }
    }

    if(sb.length() >0){
        list.add(sb.toString());
    }
    return list;
}

একটি স্ট্রিং বিভক্ত করার জন্য String.split(regex) ব্যবহার করুন:

String phone = "004-034556";
String[] output = phone.split("-");
System.out.println(output[0]);
System.out.println(output[1]);

আউটপুট:

004
034556

এখানে দুটি উপায়ে এটি অর্জন করা হয়।

উপায় 1: আপনি একটি বিশেষ চরিত্র দ্বারা দুটি সংখ্যা বিভক্ত করতে হবে, আপনি regex ব্যবহার করতে পারেন

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TrialClass
{
    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("[0-9]+");
        Matcher m = p.matcher("004-034556");

        while(m.find())
        {
            System.out.println(m.group());
        }
    }
}

উপায় 2: স্ট্রিং বিভক্ত পদ্ধতি ব্যবহার করে

public class TrialClass
{
    public static void main(String[] args)
    {
        String temp = "004-034556";
        String [] arrString = temp.split("-");
        for(String splitString:arrString)
        {
            System.out.println(splitString);
        }
    }
}

কোনও ধরণের বিভ্রান্তিকর আছে কিনা তা আপনি দুই বা ততোধিক অংশে স্ট্রিংটি বিভক্ত করতে স্ট্রিং টোকাইজার ব্যবহার করতে পারেন:

StringTokenizer st = new StringTokenizer("004-034556", "-");
while(st.hasMoreTokens())
{
    System.out.println(st.nextToken());
}

জাভা সঙ্গে 8:

    List<String> stringList = Pattern.compile("-")
            .splitAsStream("004-034556")
            .collect(Collectors.toList());

    stringList.forEach(s -> System.out.println(s));

নিচের বিবৃতিটি ব্যবহার করে আপনি একটি লাইন বিরতি দ্বারা একটি স্ট্রিং বিভক্ত করতে পারেন:

String textStr[] = yourString.split("\\r?\\n");

নিম্নলিখিত বিবৃতি ব্যবহার করে আপনি একটি হাইফেন / চরিত্র দ্বারা একটি স্ট্রিং বিভক্ত করতে পারেন:

String textStr[] = yourString.split("-");

প্রয়োজনীয়তা ব্যাখ্যা জন্য বাম রুম। আমি একটি পদ্ধতি লেখা সুপারিশ,

public final static String[] mySplit(final String s)

যা এই ফাংশন encapsulate। অবশ্যই আপনি String.split (..) ব্যবহার করতে পারেন অন্যান্য উত্তর হিসাবে বাস্তবায়ন বাস্তবায়ন।

আপনি ইনপুট স্ট্রিং এবং পছন্দসই ফলাফল এবং আচরণের জন্য কিছু ইউনিট-পরীক্ষা লিখতে হবে।

ভাল পরীক্ষার প্রার্থীদের অন্তর্ভুক্ত করা উচিত:

 - "0022-3333"
 - "-"
 - "5555-"
 - "-333"
 - "3344-"
 - "--"
 - ""
 - "553535"
 - "333-333-33"
 - "222--222"
 - "222--"
 - "--4555"

অনুযায়ী পরীক্ষার ফলাফল সংজ্ঞায়িত সঙ্গে, আপনি আচরণ নির্দিষ্ট করতে পারেন।

উদাহরণস্বরূপ, যদি "-333" ফিরে "-333" উচিত [,333] অথবা যদি এটি একটি ত্রুটি হয়। "333-333-33" [333,333-33] or [333-333,33] আলাদা করা যাবে [333,333-33] or [333-333,33] এটি একটি ত্রুটি? এবং তাই।


সংক্ষেপে: জাভাতে একটি স্ট্রিং বিভক্ত করার জন্য অন্তত পাঁচটি উপায় রয়েছে:

  1. String.split ():

    String[] parts ="10,20".split(",");
  2. Pattern.compile (regexp) .splitAsStream (ইনপুট):

    List<String> strings = Pattern.compile("\\|")
          .splitAsStream("010|020202")
          .collect(Collectors.toList());
  3. স্ট্রিং টোকাইজার (উত্তরাধিকার শ্রেণী):

    StringTokenizer strings = new StringTokenizer("Welcome to EXPLAINJAVA.COM!", ".");
    while(strings.hasMoreTokens()){
        String substring = strings.nextToken();
        System.out.println(substring);
    }
  4. গুগল গুয়াভা স্প্লিটার:

    Iterable<String> result = Splitter.on(",").split("1,2,3,4");
  5. Apache Commons StringUtils:

    String[] strings = StringUtils.split("1,2,3,4", ",");

আপনার প্রয়োজনীয়তার উপর নির্ভর করে আপনি আপনার জন্য সর্বোত্তম বিকল্পটি চয়ন করতে পারেন, যেমন ফেরত প্রকার (অ্যারে, তালিকা, বা পুনরাবৃত্তিযোগ্য)।

Here এই পদ্ধতিগুলির একটি বড় ওভারভিউ এবং সর্বাধিক সাধারণ উদাহরণ (বিন্দু, স্ল্যাশ, প্রশ্ন চিহ্ন, ইত্যাদি দ্বারা বিভক্ত কিভাবে)


সরাসরি স্ট্রিং প্রক্রিয়া করার বিকল্পটি ক্যাপচারিং গ্রুপগুলির সাথে নিয়মিত অভিব্যক্তি ব্যবহার করা হবে। এই সুবিধাটি এটি ইনপুট আরো জটিল পরিমাপ বোঝানো সহজতর করে তোলে। উদাহরণস্বরূপ, নিম্নলিখিত দুটি অংশে স্ট্রিংটি বিভক্ত করে এবং নিশ্চিত করে যে উভয়ই শুধুমাত্র সংখ্যার সমন্বয়ে গঠিত:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class SplitExample
{
    private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");

    public static void checkString(String s)
    {
        Matcher m = twopart.matcher(s);
        if (m.matches()) {
            System.out.println(s + " matches; first part is " + m.group(1) +
                               ", second part is " + m.group(2) + ".");
        } else {
            System.out.println(s + " does not match.");
        }
    }

    public static void main(String[] args) {
        checkString("123-4567");
        checkString("foo-bar");
        checkString("123-");
        checkString("-4567");
        checkString("123-4567-890");
    }
}

এই উদাহরণে প্যাটার্ন সংশোধন করা হয়েছে, এটি অগ্রিম সংকলিত এবং একটি স্ট্যাটিক সদস্য হিসাবে সংরক্ষণ করা যেতে পারে (উদাহরণে ক্লাস লোড সময় শুরু)। নিয়মিত অভিব্যক্তি হল:

(\d+)-(\d+)

বন্ধনী capturing গ্রুপ নির্দেশ করে; regexp এর যে অংশটি মিলেছে সেটি MatchGroup () পদ্ধতিতে অ্যাক্সেস করা যেতে পারে। \ D মিল এবং একক দশমিক সংখ্যা, এবং + অর্থ "পূর্বের অভিব্যক্তিটির এক বা একাধিকর সাথে মেলে)। - এর কোনো বিশেষ অর্থ নেই, তাই ইনপুটটিতে কেবল সেই চরিত্রটিকে মেলে। দ্রষ্টব্য করুন যে ব্যাকস্ল্যাশগুলি দুবার থেকে পালাতে হবে যখন এটি জাভা স্ট্রিং হিসাবে লেখা হয়। কিছু অন্যান্য উদাহরণ:

([A-Z]+)-([A-Z]+)          // Each part consists of only capital letters 
([^-]+)-([^-]+)            // Each part consists of characters other than -
([A-Z]{2})-(\d+)           // The first part is exactly two capital letters,
                           // the second consists of digits

org.apache.commons.lang.StringUtils' স্প্লিট পদ্ধতি ব্যবহার করুন যা আপনি ভাগ করতে চান এমন অক্ষর বা স্ট্রিংয়ের উপর ভিত্তি করে স্ট্রিংগুলি বিভক্ত করতে পারে।

পদ্ধতি স্বাক্ষর:

public static String[] split(String str, char separatorChar);

আপনার ক্ষেত্রে, যখন আপনি একটি স্ট্রিং বিভাজন করতে চান "-"।

আপনি সহজভাবে অনুসরণ করতে পারেন:

String str = "004-034556";

String split[] = StringUtils.split(str,"-");

আউটপুট:

004
034556

অনুমান করুন যে - যদি আপনার স্ট্রিংয়ে বিদ্যমান না থাকে, তবে এটি প্রদত্ত স্ট্রিংটি ফেরত দেয়, এবং আপনি কোনও ব্যতিক্রম পাবেন না।


Regex ব্যবহার করে একাধিক অক্ষর দিয়ে স্ট্রিং বিভক্ত

public class StringSplitTest {
     public static void main(String args[]) {
        String s = " ;String; String; String; String, String; String;;String;String; String; String; ;String;String;String;String";
        //String[] strs = s.split("[,\\s\\;]");
        String[] strs = s.split("[,\\;]");
        System.out.println("Substrings length:"+strs.length);
        for (int i=0; i < strs.length; i++) {
            System.out.println("Str["+i+"]:"+strs[i]);
        }
     }
  }

আউটপুট:

Substrings length:17
Str[0]:
Str[1]:String
Str[2]: String
Str[3]: String
Str[4]: String
Str[5]: String
Str[6]: String
Str[7]:
Str[8]:String
Str[9]:String
Str[10]: String
Str[11]: String
Str[12]:
Str[13]:String
Str[14]:String
Str[15]:String
Str[16]:String

কিন্তু সমস্ত জেডিকে সংস্করণ জুড়ে একই আউটপুট আশা করবেন না। আমি এমন একটি বাগ দেখেছি যা কিছু JDK সংস্করণগুলিতে বিদ্যমান যেখানে প্রথম নল স্ট্রিংটি উপেক্ষা করা হয়েছে। এই বাগটি সর্বশেষ JDK সংস্করণে উপস্থিত নয়, তবে এটি JDK 1.7 এর শেষ সংস্করণ এবং 1.8 প্রারম্ভিক সংস্করণের মধ্যে কিছু সংস্করণে বিদ্যমান।


import java.io.*;

public class BreakString {

  public static void main(String args[]) {

    String string = "004-034556-1234-2341";
    String[] parts = string.split("-");

    for(int i=0;i<parts.length;i++) 
      System.out.println(parts[i]);
    }
  }
}

public class SplitTest {

    public static String[] split(String text, String delimiter) {
        java.util.List<String> parts = new java.util.ArrayList<String>();

        text += delimiter;

        for (int i = text.indexOf(delimiter), j=0; i != -1;) {
            String temp = text.substring(j,i);
            if(temp.trim().length() != 0) {
                parts.add(temp);
            }
            j = i + delimiter.length();
            i = text.indexOf(delimiter,j);
        }

        return parts.toArray(new String[0]);
    }


    public static void main(String[] args) {
        String str = "004-034556";
        String delimiter = "-";
        String result[] = split(str, delimiter);
        for(String s:result)
            System.out.println(s);
    }
}

String str="004-034556"
String[] sTemp=str.split("-");// '-' is a delimiter

string1=004 // sTemp[0];
string2=034556//sTemp[1];

String[] out = string.split("-");

আপনি চান জিনিস করতে হবে। স্ট্রিং ক্লাস স্ট্রিং সঙ্গে কাজ করার অনেক পদ্ধতি আছে।





string