string شرح - لا تعمل طريقة split () في Java على نقطة (.)





c# convert (7)


java.lang.String.split الانقسامات على التعبيرات العادية ، و . في التعبير العادي يعني "أي شخصية".

جرّب temp.split("\\.") .

هذا السؤال لديه بالفعل إجابة هنا:

أعددت مقتطفًا بسيطًا من الشفرات لفصل الجزء الخطأ عن تطبيق الويب.

public class Main {

    public static void main(String[] args) throws IOException {
        System.out.print("\nEnter a string:->");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String temp = br.readLine();

        String words[] = temp.split(".");

        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i] + "\n");
        }
    }
}

لقد اختبرت ذلك أثناء بناء تطبيق ويب JSF. أنا فقط أريد أن أعرف لماذا لا يعمل temp.split(".") في رمز أعلاه. البيان،

System.out.println(words[i]+"\n"); 

يعرض أي شيء على وحدة التحكم يعني أنه لا يمر من خلال الحلقة. عندما أقوم بتغيير وسيطة الأسلوب temp.split() لأحرف أخرى ، يعمل بشكل جيد كالمعتاد. ماذا يمكن أن يكون مشكلة؟




تأخذ هذه الطريقة تعبيرًا عاديًا ، وليس سلسلة ، والنقطة لها معنى خاص في التعبيرات العادية. الهروب من ذلك مثل ذلك split("\\.") . تحتاج إلى خط مائل عكسي مزدوج ، والثاني يهرب الأول.




java.lang.String.split تقول:

تقسيم هذه السلسلة حول التطابقات الخاصة بالتعبير العادي المحدد.

(التشديد لي.)

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

String[] words = temp.split(Pattern.quote("."));



    private String temp = "mahesh.hiren.darshan";

    String s_temp[] = temp.split("[.]");

  Log.e("1", ""+s_temp[0]);



أنه يعمل بشكل جيد. هل قرأت java.lang.String.split ؟ يتم تحويل السلسلة إلى تعبير عادي.

. هو الحرف الخاص الذي يطابق كل حروف الإدخال.

كما هو الحال مع أي حرف خاص تعبير عادي ، يمكنك الهروب مع \ . تحتاج إلى \ إضافية لخروج سلسلة Java.




\\. هو الجواب البسيط. هنا هو رمز بسيط لمساعدتكم.

while (line != null) {
    //             
    String[] words = line.split("\\.");
    wr = "";
    mean = "";
    if (words.length > 2) {
        wr = words[0] + words[1];
        mean = words[2];

    } else {
        wr = words[0];
        mean = words[1];
    }
}



وإليك طريقة جيدة لإنشاء تسرب للذاكرة صحيح (كائنات لا يمكن الوصول إليها عن طريق تشغيل التعليمات البرمجية ولكن لا تزال مخزنة في الذاكرة) في جافا نقية:

  1. ينشئ التطبيق مؤشر ترابط تشغيل - طويلة (أو استخدام تجمع مؤشر ترابط إلى تسرب أسرع).
  2. يقوم مؤشر الترابط بتحميل فئة عبر ClassLoader (مخصص اختياري).
  3. يخصص الفصل جزءًا كبيرًا من الذاكرة (مثل new byte[1000000] ) ، ويقوم بتخزين مرجع قوي له في حقل ثابت ، ثم يقوم بتخزين مرجع إلى نفسه في ThreadLocal. تخصيص ذاكرة إضافية أمر اختياري (تسريب مثيل Class يكفي) ، ولكنه سيجعل التسريب يعمل بشكل أسرع.
  4. يقوم مؤشر الترابط بمسح كافة المراجع إلى الفئة المخصصة أو ClassLoader تم تحميله من.
  5. كرر.

هذا يعمل لأن ThreadLocal يحتفظ بمرجع إلى الكائن ، الذي يحتفظ بمرجع إلى الفئة الخاصة به ، والذي بدوره يحتفظ مرجع إلى ClassLoader الخاص به. يحافظ ClassLoader بدوره على مرجع لكل الفئات التي قام بتحميلها.

(كان الأمر أسوأ في العديد من تطبيقات JVM ، خاصة قبل Java 7 ، لأنه تم تخصيص Classes و ClassLoaders مباشرة في permgen ولم يكن GC أبدًا على الإطلاق. ومع ذلك ، وبغض النظر عن كيفية معالجة JVM لتفريغ الطبقة ، فإن ThreadLocal سيظل يمنع كائن فئة من المستصلحة.)

هناك تباين في هذا النمط هو السبب في أن حاويات التطبيق (مثل Tomcat) يمكن أن تسرّب الذاكرة مثل المنخل إذا كنت تقوم بإعادة نشر التطبيقات التي تستخدم ThreadLocals بأي طريقة. (حيث تستخدم حاوية التطبيق مؤشرات الترابط كما هو موضح ، وفي كل مرة تقوم فيها بإعادة التطبيق ، يتم استخدام أداة ClassLoader جديدة.)

تحديث : نظرًا لأن الكثير من الأشخاص لا يزالون يسألون عن هذا ، إليك بعض الأمثلة على التعليمات البرمجية التي توضح هذا السلوك أثناء العمل .





java string split