JavaRush /مدونة جافا /Random-AR /طريقة التقسيم في Java: تقسيم السلسلة إلى أجزاء

طريقة التقسيم في Java: تقسيم السلسلة إلى أجزاء

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

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

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

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

  2. تأخذ الطريقة سلسلة regex كمعلمة.

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

طريقة التقسيم في 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 على طريقة تقسيم أخرى بهذا التوقيع:
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) {
        // Notice the space at the end of the line
        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, ]

        Note that the last element of the array is
        an empty string, resulting from the space
        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) {
        // Notice the space at the end of the line
        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، خيار، 20.05، 2، طماطم، 123.45، 3، أرنب، 0.50
نحن نواجه مهمة حساب التكلفة الإجمالية للطلب. هنا سيتعين علينا استخدام طريقة التقسيم عدة مرات. الخطوة الأولى هي تقسيم السلسلة من خلال الرمز "؛" إلى الأجزاء المكونة لها. ثم في كل جزء سيكون لدينا معلومات حول منتج فردي يمكننا معالجته في المستقبل. وبعد ذلك، داخل كل منتج، سنقوم بفصل المعلومات باستخدام الرمز ""، ونأخذ من المصفوفة الناتجة عنصرًا بفهرس معين (الذي يتم تخزين السعر فيه)، وتحويله إلى نموذج رقمي وتجميع التكلفة النهائية من الأمر. لنكتب طريقة تحسب كل هذا:
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1, cucumbers, 20.05; 2, tomatoes, 123.45; 3, hares, 0.50";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 144.0
    }

    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