CodeGym /مدونة جافا /Random-AR /طريقة Java String.split()
John Squirrels
مستوى
San Francisco

طريقة Java String.split()

نشرت في المجموعة
دعونا نتحدث عن طريقة String.split الخاصة بـ Java : ماذا تفعل ولماذا هناك حاجة إليها. ليس من الصعب تخمين أنه يقسم سلسلة Java، ولكن كيف يتم ذلك عمليًا؟ دعونا نتعمق في تشغيل الطريقة ونناقش بعض التفاصيل غير الواضحة. في الوقت نفسه، سوف نتعلم عدد طرق الانقسام الموجودة في السلسلة بالفعل. دعنا نذهب!

الوصف والتوقيع لـ String.split في Java

في Java، تقوم طريقة التقسيم بتقسيم السلسلة إلى سلاسل فرعية باستخدام محدد محدد باستخدام تعبير عادي. لنقدم توقيع الطريقة ونبدأ بالغوص:

String[] split(String regex)
ويتضح من التوقيع أمران:
  1. تقوم الطريقة بإرجاع مجموعة من السلاسل.
  2. تحتوي الطريقة على معلمة إدخال سلسلة تسمى regex .
دعونا نحلل كل واحدة منها على حدة بينما نقوم بتفصيل الوصف المذكور أعلاه.
  1. تقوم الطريقة بإرجاع مجموعة من السلاسل.

    يحتوي الإعلان على الكلمات التالية: "في Java، يقوم أسلوب التقسيم بتقسيم السلسلة إلى سلاسل فرعية." تجمع الطريقة هذه السلاسل الفرعية في مصفوفة تصبح القيمة المرجعة.

  2. تحتوي الطريقة على معلمة إدخال سلسلة تسمى regex .

    مرة أخرى، تذكر الوصف: "يقسم سلسلة إلى سلاسل فرعية باستخدام محدد محدد باستخدام تعبير عادي." معلمة إدخال regex هي تعبير عادي يتم تطبيقه على السلسلة الأصلية . عندما يتطابق الحرف أو مجموعة الأحرف، يتم التعامل معها كمحدد.

طريقة String.split () في Java: تقسيم السلسلة إلى أجزاء - 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" }
"الأحمر والبرتقالي والأصفر" "،" { "أحمر" ، "برتقالي" ، "أصفر" }
"الأحمر والبرتقالي والأصفر" "،" { "أحمر" ، "برتقالي" ، "أصفر" }
لاحظ الاختلافات بين الصفين الأخيرين في الجدول أعلاه. في الصف الثاني إلى الأخير، يتم استخدام الفاصلة كمحدد. ونتيجة لذلك، عندما يتم تقسيم السلسلة، تحتوي بعض الكلمات على مسافات بادئة. في الصف الأخير، استخدمنا فاصلة ومسافة كمحدد لدينا. لهذا السبب لم تكن هناك سلاسل فرعية ذات مسافات بادئة في المصفوفة الناتجة. هذه مجرد تفاصيل دقيقة توضح مدى أهمية اختيار المحدد الصحيح بعناية.

المحدد الرائد

هذا هو فارق بسيط آخر مهم. إذا كانت السلسلة الأصلية تبدأ بالمحدد، فسيكون العنصر الأول في المصفوفة الناتجة عبارة عن سلسلة فارغة. على سبيل المثال، ستبدو كما يلي: السلسلة الأصلية: " أنا أحب 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[] 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));
    }
}
إذا ألقينا نظرة خاطفة على تنفيذ الإصدار ذي المعلمة الواحدة من طريقة التقسيم ، فيمكننا أن نرى أنها تشبه شقيقتها المحملة بشكل زائد، ولكن مع تعيين الوسيطة الثانية على صفر:

    public String[] split(String regex) {
        return split(regex, 0);
    }

أمثلة مختلفة

في الممارسة العملية، يحدث أحيانًا أن يكون لدينا سلاسل يتم إنشاؤها وفقًا لقواعد معينة. قد تأتي مثل هذه السلسلة إلى برنامجنا من أي مكان:
  • من خدمة طرف ثالث؛
  • من طلب تم إرساله إلى خادمنا؛
  • من ملف التكوين؛
  • وما إلى ذلك وهلم جرا.
في هذه المواقف، عادة ما يعرف المبرمج "قواعد اللعبة". لنفترض أن المبرمج يعرف أنه يتعامل مع معلومات المستخدم المخزنة وفقًا لهذا النمط:
user_id|user_login|user_email
لنأخذ بعض القيم المحددة كمثال:
135|بندر|بندر@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]
    }
}
لاحظ المحدد: "\\|" . في التعبيرات العادية، "|" هو حرف خاص ذو معنى خاص، لذا إذا أردنا استخدامه كحرف عادي (أي ما نريد العثور عليه في السلسلة الأصلية)، فسنحتاج إلى الهروب من الحرف بخطين مائلين عكسيين. النظر في مثال آخر. لنفترض أن لدينا معلومات الطلب التي تم تنظيمها على النحو التالي:
item_number_1,item_name_1,item_price_1;item_number_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_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;
    }
}
معرفة ما إذا كان بإمكانك معرفة كيفية عمل هذه الطريقة بنفسك. بناءً على هذه الأمثلة، يمكننا القول أنه يتم استخدام طريقة التقسيم عندما يكون لدينا بعض البيانات المنسقة كسلسلة، ونحتاج إلى استخراج معلومات معينة أكثر تحديدًا منها.

ملخص

لقد درسنا طريقة الانقسام لفئة السلسلة . إنه ما تحتاجه تمامًا عندما يتعين عليك تقسيم سلسلة إلى الأجزاء المكونة لها بمساعدة محدد خاص. تقوم الطريقة بإرجاع مصفوفة من السلاسل (السلاسل الفرعية التي تشكل السلسلة الأصلية). يقبل التعبير العادي الذي تمثل مطابقاته الحرف (الأحرف) المحدد. لقد درسنا التفاصيل الدقيقة لهذه الطريقة:
  • محدد رئيسي؛
  • شقيقها المثقل بمعلمتين.
لقد حاولنا أيضًا نمذجة بعض مواقف الحياة الواقعية حيث استخدمنا طريقة التقسيم لحل مشكلات افتراضية، ولكنها واقعية تمامًا.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION