CodeGym /وبلاگ جاوا /Random-FA /روش جاوا String.split()
John Squirrels
مرحله
San Francisco

روش جاوا String.split()

در گروه منتشر شد
بیایید در مورد روش String.split جاوا صحبت کنیم : چه کاری انجام می دهد و چرا به آن نیاز است. حدس زدن اینکه یک رشته جاوا را تقسیم می کند سخت نیست، اما در عمل چگونه کار می کند؟ بیایید عمیقاً در عملکرد این روش غوطه ور شویم و برخی جزئیات غیر واضح را مورد بحث قرار دهیم. در همان زمان، ما خواهیم آموخت که رشته در واقع چند روش تقسیم دارد. بیا بریم!

توضیحات و امضا برای String.split جاوا

در جاوا، روش تقسیم یک رشته را با استفاده از یک جداکننده که با استفاده از یک عبارت منظم تعریف شده است، به زیر رشته ها تقسیم می کند. بیایید امضای روش را ارائه کنیم و شیرجه خود را شروع کنیم:
String[] split(String regex)
دو چیز از امضا مشخص است:
  1. متد آرایه ای از رشته ها را برمی گرداند.
  2. این روش دارای یک پارامتر ورودی رشته ای به نام regex است .
اجازه دهید هر یک از این موارد را به طور جداگانه تجزیه و تحلیل کنیم و توضیحات ارائه شده در بالا را تجزیه کنیم.
  1. متد آرایه ای از رشته ها را برمی گرداند.

    این اعلان حاوی کلمات زیر است: "در جاوا، متد split یک رشته را به زیر رشته ها تقسیم می کند." متد این زیررشته‌ها را در یک آرایه جمع‌آوری می‌کند که تبدیل به مقدار بازگشتی می‌شود.

  2. این روش دارای یک پارامتر ورودی رشته ای به نام regex است .

    باز هم، توضیح را به خاطر بیاورید: "رشته ای را با استفاده از یک جداکننده که با استفاده از یک عبارت منظم تعریف شده است به زیر رشته ها تقسیم می کند." پارامتر ورودی regex یک عبارت منظم است که به رشته اصلی اعمال می شود. هنگامی که کاراکتر یا ترکیبی از کاراکترها مطابقت دارند، آنها به عنوان یک جداکننده در نظر گرفته می شوند.

متد String.split() در جاوا: تقسیم یک رشته به قطعات - 1

تقسیم جاوا در عمل

حالا بیایید به اصل مطلب نزدیک شویم. بیایید تصور کنیم که یک رشته کلمات داریم. به عنوان مثال، مانند این:
من عاشق جاوا هستم
ما باید رشته را به کلمات تقسیم کنیم. می بینیم که کلمات این رشته با فاصله از یکدیگر جدا شده اند. در این مورد، یک کاراکتر فضایی کاندید مناسبی برای جداکننده ما است. کد حل وظیفه ما به صورت زیر است:
public class Main {
    public static void main(String[] args) {
        String str = "I love Java";
        String[] words = str.split(" ");
        for (String word : words) {
            System.out.println(word);
        }
    }
}
خروجی روش اصلی خطوط زیر خواهد بود:
من عاشق جاوا هستم
بیایید چند نمونه دیگر از نحوه عملکرد روش تقسیم را ببینیم:
رشته حائل، جداکننده نتیجه روش
"من عاشق جاوا هستم" "" (شخصیت فضایی) { "من" ، "عشق" ، "جاوا" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"قرمز، نارنجی، زرد" "" { "قرمز" ، "نارنجی" ، "زرد" }
"قرمز، نارنجی، زرد" "،" { "قرمز" ، "نارنجی" ، "زرد" }
به تفاوت بین دو ردیف آخر در جدول بالا توجه کنید. در ردیف دوم تا آخر از کاما به عنوان جداکننده استفاده می شود. در نتیجه، وقتی رشته تقسیم می شود، برخی از کلمات دارای فاصله های پیشرو هستند. در ردیف آخر از کاما و فاصله به عنوان جداکننده استفاده کردیم. به همین دلیل است که هیچ زیررشته ای با فاصله های پیشرو در آرایه حاصل وجود نداشت. این فقط یک جزئیات ظریف است که نشان می دهد چقدر مهم است که جداکننده مناسب را انتخاب کنید.

جداکننده پیشرو

این یک نکته مهم دیگر است. اگر رشته اصلی با جداکننده شروع شود، اولین عنصر آرایه به دست آمده یک رشته خالی خواهد بود. به عنوان مثال، به این صورت خواهد بود: رشته اصلی: "I love Java" جداکننده: " " آرایه حاصل: { "", "I", "love", "Java" } اما اگر رشته اصلی با جداکننده ختم شود. از شروع با یک، نتیجه متفاوت خواهد بود: رشته اصلی: "I love Java" جداکننده: " " آرایه حاصل: { "I", "love", "Java" } به کد نگاه کنید و ببینید چگونه روش تقسیم با نماد جداکننده در انتهای و/یا ابتدای رشته اصلی متفاوت عمل می کند:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" "));
        print(" I love Java".split(" "));
        print("I love Java ".split(" "));
        print(" I love Java ".split(" "));
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
خروجی روش اصلی به صورت زیر خواهد بود:
[من، عشق، جاوا] [، من، عشق، جاوا] [من، عشق، جاوا] [، من، عشق، جاوا]
دوباره توجه خود را به این واقعیت معطوف کنید که وقتی اولین کاراکتر در رشته اصلی یک کاراکتر جداکننده باشد، نتیجه این است که اولین عنصر در آرایه یک رشته خالی خواهد بود.

خواهر و برادر پر بار

کلاس String متد تقسیم دیگری با امضای زیر دارد :
String[] split(String regex, int limit)
این روش یک پارامتر حد اضافی دارد : تعیین می کند که چند بار الگوی regex روی رشته اصلی اعمال شود. توضیحات زیر را ببینید:

حد > 0

این الگو محدود -1 بار اعمال می شود. علاوه بر این، طول آرایه برگشتی از مقدار پارامتر حد تجاوز نخواهد کرد . آخرین عنصر آرایه، بخشی از رشته خواهد بود که از آخرین جایی که جداکننده پیدا شد، می آید. مثال:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" ", 1));
        print("I love Java".split(" ", 2));
        /*
         Output:
         [I love Java]
         [I, love Java]
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

محدود < 0

عبارت منظم جداکننده تا جایی که ممکن است به رشته اعمال می شود. آرایه حاصل می تواند هر طولی داشته باشد. مثال:
public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", -1));
        print("I love Java ".split(" ", -2));
        print("I love Java ".split(" ", -12));
        /*
         Output:
        [I, love, Java, ]
        [I, love, Java, ]
        [I, love, Java, ]

        Please note that the last element of the array is
        an empty string. This is caused by the whitespace
        at the end of the original string.
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

حد = 0

مانند موردی که در آن محدودیت <0، الگوی جداکننده تا آنجا که ممکن است به رشته اعمال می شود. آرایه نهایی می تواند هر طولی داشته باشد. اگر آخرین عناصر رشته های خالی باشند، از آرایه نهایی حذف می شوند. مثال:
public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        /*
         Output:
        [I, love, Java]
        [I, love, Java]
        [I, love, Java]
        Note the absence of empty strings at the end of the arrays
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
اگر به اجرای نسخه تک پارامتری متد split نگاهی بیندازیم، می بینیم که مانند برادر بارگذاری شده اش است، اما آرگومان دوم روی صفر تنظیم شده است:
public String[] split(String regex) {
    return split(regex, 0);
}

نمونه های مختلف

در عمل در دنیای واقعی، گاهی اوقات اتفاق می افتد که رشته هایی داریم که طبق قوانین خاصی تولید می شوند. چنین رشته ای ممکن است از هر کجا وارد برنامه ما شود:
  • از یک سرویس شخص ثالث؛
  • از یک درخواست ارسال شده به سرور ما؛
  • از یک فایل پیکربندی؛
  • و غیره
در این مواقع برنامه نویس معمولا «قواعد بازی» را می داند. فرض کنید یک برنامه نویس می داند که با اطلاعات کاربر که طبق این الگو ذخیره شده است سروکار دارد:
user_id|user_login|user_email
بیایید چند مقدار خاص را به عنوان مثال در نظر بگیریم:
135|bender|bender@gmail.com
فرض کنید وظیفه برنامه نویس نوشتن روشی است که برای کاربر ایمیل ارسال می کند. برنامه نویس به داده های کاربر دسترسی دارد که در فرمت ذکر شده در بالا ثبت شده است. وظیفه فرعی که اکنون به تحلیل آن ادامه خواهیم داد این است که چگونه آدرس ایمیل را از بقیه داده های کاربر جدا کنیم. این یکی از مواردی است که روش تقسیم می تواند مفید باشد. به هر حال، اگر به الگوی داده‌های کاربر نگاه کنیم، متوجه می‌شویم که استخراج آدرس ایمیل کاربر از بقیه موارد ساده است مانند فراخوانی روش تقسیم برای تقسیم رشته. سپس آدرس ایمیل در آخرین عنصر آرایه به دست آمده خواهد بود. در اینجا نمونه ای از روشی است که رشته ای حاوی داده های کاربر را می گیرد و آدرس ایمیل کاربر را برمی گرداند. برای سادگی، بیایید بگوییم که رشته داده همیشه در قالبی است که ما می خواهیم:
public class Main {
    public static void main(String[] args) {
        String userInfo = "135|bender|bender@gmail.com";
        System.out.println(getUserEmail(userInfo));
        // Output: bender@gmail.com
    }

    static String getUserEmail(String userInfo) {
        String[] data = userInfo.split("\\|");
        return data[2]; // or data[data.length - 1]
    }
}
به جداکننده توجه کنید: "\\|" . در عبارات منظم، "|" یک کاراکتر خاص با معنای خاص است، بنابراین اگر بخواهیم از آن یک کاراکتر معمولی استفاده کنیم (یعنی چیزی که می خواهیم در رشته اصلی پیدا کنیم)، باید با دو اسلش از کاراکتر فرار کنیم. مثال دیگری را در نظر بگیرید. فرض کنید اطلاعات سفارش داریم که ساختار آن به این صورت است:
آیتم_شماره_1، نام_مورد_1، قیمت_اقلام_1;شماره_مورد_2،نام_مورد_2،قیمت_مورد_2؛...;شماره_مورد_n،نام_مورد_n،قیمت_مورد
یا حتی می توانیم برخی از مقادیر خاص را اتخاذ کنیم:
1، خیار، 2.39؛ 2، گوجه فرنگی، 1.89، 3، بیکن، 4.99
وظیفه ما محاسبه کل هزینه سفارش است. در اینجا باید چندین بار روش تقسیم را اعمال کنیم. اولین قدم این است که رشته را با استفاده از ";" تقسیم کنید. به عنوان جداکننده به منظور شکستن آن به اجزای سازنده آن. سپس هر زیر رشته به دست آمده اطلاعاتی در مورد یک محصول مجزا خواهد داشت که بعداً می توانیم آن را پردازش کنیم. سپس، برای هر محصول، اطلاعات مربوطه را با استفاده از نماد "" از هم جدا می کنیم. از آرایه رشته ای به دست آمده، یک عنصر با یک شاخص خاص (هزینه ای که قیمت محصول در آن ذخیره می شود) می گیریم، آن را به شکل عددی تبدیل می کنیم و هزینه کل سفارش را محاسبه می کنیم. بیایید روشی بنویسیم که تمام این محاسبات را انجام دهد:
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 9.27
    }

    static double getTotalOrderAmount(String orderInfo) {
        double totalAmount = 0d;
        final String[] items = orderInfo.split(";");

        for (String item : items) {
            final String[] itemInfo = item.split(",");
            totalAmount += Double.parseDouble(itemInfo[2]);
        }

        return totalAmount;
    }
}
ببینید آیا می توانید بفهمید که چگونه این روش به تنهایی کار می کند. با توجه به این مثال‌ها می‌توان گفت که روش تقسیم زمانی استفاده می‌شود که داده‌هایی را به صورت رشته‌ای قالب‌بندی کرده‌ایم و باید اطلاعات خاص تری را از آن استخراج کنیم.

خلاصه

ما روش تقسیم کلاس String را بررسی کردیم . زمانی که باید یک رشته را با کمک یک جداکننده خاص به اجزای سازنده آن تقسیم کنید، این همان چیزی است که به آن نیاز دارید. متد آرایه ای از رشته ها (رشته های فرعی که رشته اصلی را تشکیل می دهند) برمی گرداند. یک عبارت منظم را می‌پذیرد که مطابقت‌های آن نشان دهنده کاراکتر(های) جداکننده است. ما ظرافت های مختلف این روش را بررسی کردیم:
  • جداکننده پیشرو؛
  • خواهر و برادر بارگذاری شده آن با دو پارامتر.
ما همچنین سعی کردیم برخی از موقعیت‌های زندگی واقعی را مدل‌سازی کنیم که در آن از روش تقسیم برای حل مسائل فرضی، اما کاملاً واقع بینانه استفاده کردیم .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION