الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اختبر قدراتك في الجافا - الحلقة الرابعة

مغلق
بدأه Snack3r في 24 نوفمبر 2013 · 14 رد · 968 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

فهرس الحلقات.

 

الهدف من هذه الحلقة هو كتابة فئة تسمح باستخراج مجموعة بيانات من String معينة.

الفئة StringsManipulation يجب أن تحتوي على :

  • الدالة int extraireSousChaine(String chaine, String souschaine)l التي تُعيد عدد المرات التي ظهرت فيها الجملة souschaine داخل الجملة الأم chaine.
  • int[][] extraireChiffre(String str)l التي تُعيد مجموعة الأرقام التي ظهرت في الجملة str على شكل جدول من المصفوفات.
  • بالإضافة إلى دالة تُمكن من إظهار نتائج الدالة السابقة.

 

 

تُرسل الإجابة على الخاص + سيتم الإعلان عن الحل في حدود 24 ساعة.

 

 

تحياتي.

تم تعديل هذه المشاركة بواسطة Snack3r في 24 نوفمبر 2013 في 23:03

3
#2

جميل :)
بالنسبة لـ extraireChiffre

تعيد مجموعة الأرقام ... عرّف "مجموعة" : هل يجب أن تعيد كل رقم على حدة ..أم كل عدّة أرقام متصلة تعتبرهم مجموعة ؟
مثلاً
"3515شيش35145سيسيل654" هل نعيد 3515و35145و654 (يعني 3 عناصر) أم كل رقم لوحده ؟وماذا لو كانت الأرقام اكبر من حجم int ?

#3
اقتباس

بالنسبة لـ extraireChiffre تعيد مجموعة الأرقام ... عرّف "مجموعة" : هل يجب أن تعيد كل رقم على حدة ..أم كل عدّة أرقام متصلة تعتبرهم مجموعة ؟

مثلاً

"3515شيش35145سيسيل654" هل نعيد 3515و35145و654 (يعني 3 عناصر) أم كل رقم لوحده ؟

 

في هذه الحالة, تُعيد مصفوفة من 3 جداول, الجدول الأول يتكون من 3,5,1,5 و الثاني : 3,5,1,4,5 و الثالث : 6,4,5.

 

اقتباس
وماذا لو كانت الأرقام اكبر من حجم int ?

 

لا يُمكن أن تتعدى حجم short حتى ! لأنك تتعامل مع الأرقام و ليس الأعداد.

 

أعتقد أنني لم أشرح المطلوب بشكل واضح في المشاركة بالأعلى, تم التعديل.

تم تعديل هذه المشاركة بواسطة Snack3r في 24 نوفمبر 2013 في 22:58

#4

محاولة العضو أحمد أبو عبد البر :

import java.util.ArrayList;import org.apache.commons.lang3.StringUtils;public class StringsManipulation{      public static int extraireSousChaine ( String chaine , String souschaine )      {            return StringUtils.countMatches ( chaine , souschaine );      }      public static int[][] extraireChiffre ( String str )      {            int sizeOfbigeliment = 0;            /*             أنشأت مصفوفة  من نوع كائن وجعلت الكائنات التي ستحتويها مصفوفات من نوع             Integer             */            ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>> ();            for( int i = 0 ; i < str.length () ; i ++ ) {                  //إنشاء مصفوفة مؤقتة لمئها بالمجموعات العددية                  ArrayList<Integer> temp = new ArrayList<Integer> ();                  //التحقق من من وجود رقم                  if( StringUtils.isNumeric ( str.substring ( i , i + 1 ) ) ) {                        //فإن وجدنا  رقما وضعناه في المصفوفة المؤقتة                        temp.add ( Integer.parseInt ( str.substring ( i , i + 1 ) ) );                        //ثم نذهب إلى المحرف التالي بعد الرقم الذي وجدناه سابق ونتحقق هل هو رقم                        for( int j = i + 1 ; j < str.length () ; j ++ )                              //فإن وجدناه رقما أضفناه إلى المصففة المؤقتة                              if( StringUtils.isNumeric ( str.substring ( j , j + 1 ) ) ) {                                    temp.add ( Integer.parseInt ( str.substring ( j , j + 1 ) ) );                                    //نأخذ طول المصفوفة المؤقتة ونخزنه في المتغير التالي                                    //نريد أن نعرف أطول مصفوفة ستعرف فائدة ذلك لاحقا                                    if( temp.size () > sizeOfbigeliment )                                          sizeOfbigeliment = temp.size ();                              }                              //غن لم نجد رقما نلغي التحقق                              else break;                        //نقفز إلى ما بعد آخر رقم وجدناه                        i += temp.size ();                        //نضيف المصفوفة المؤقتتة إلى المصفوفة الأم                        list.add ( temp );                  }            }            //نقل المصفوفة الثانئية البعد الكائنية إلى مصفوفة ثنائية البعد ثابتة            int[][] a = new int[ list.size () ][ sizeOfbigeliment ];            for( int i = 0 ; i < a.length ; i ++ )                  for( int j = 0 ; j < list.get ( i ).size () ; j ++ )                        a[j] = list.get ( i ).get ( j );            return a;      }      public static void imprimeExtraireSousChaine ( String chaine , String souschaine )      {            System.out.println ( "count of  " + souschaine + " is " + extraireSousChaine ( chaine , souschaine ) );      }      public static void imprimeExtraireChiffre ( String str )      {            int temp[][] = extraireChiffre ( str );            System.out.println ( "Array of numeric char :" );            for( int[] temp1 : temp ) {                  for( int j = 0 ; j < temp1.length ; j ++ )                        if( temp1[j] != 0 )                              System.out.print ( temp1[j] + "  " );                  System.out.println ();            }      }      public static void main ( String[] arg )      {            imprimeExtraireSousChaine ( "aujshdvhljhrgkher54bd5d5d5d5d5d565" , "h" );            imprimeExtraireChiffre ( "aujshdvhljhr412577gkher54bd5d5d5d5d5d565" );      }}

ملاحظاتي :

  • بطبيعة الحال, يُمنع استخدام الدوال الجاهزة بشكل كلي. (تخيل أنك لم تكن تعمل مع StringUtils, كيف ستقوم بكتابة الكود ؟  :) )
  • يُستحسن دائما الاستعانة بالدوال القياسية و القياسية فقط.
  • لا أملك الحزمة org.apache.commons.lang3 لذا لم أستطع تجربة الكود تبعك.
  • أعتقد أن المنطق الذي اتبعته لكتابة الدالة extraireChiffre مُعقد و يحتاج إلى تبسيط (بس متزعلش مني يا ابو حميد ^_^ )

 

محاولة العضو مصطفى 36a2 :

import java.util.Vector;public class Forth {    public static void main(String[] args) {        new StringsManipulation ("Hello123Man!875");        System.out.println(        (new StringsManipulation ("Hlo1sd23Mwe24an!8275"))        .extraireSousChaine("MoshaMoqwMokd", "Mo"));    }}class StringsManipulation {    private String string;    int[][]Table;    StringsManipulation (String input){        string=input;        extraireChiffre(this.string);        print();    }    int extraireSousChaine(String chaine, String souschaine){        return chaine.split(souschaine).length-1;    }    int[][]extraireChiffre(String str){        int y=0;        Vector<Vector<Integer>>Mosty=new Vector<Vector<Integer>>();        for(int i=0;i<string.length();i++)            if(Character.isDigit(string.charAt(i)))            {                Mosty.add(new Vector<Integer>());                for(int j=i;j<string.length()&&                        Character.isDigit(string.charAt(j));j++,i++)                    Mosty.get(y).add(new Integer((int)(string.charAt(j)-'0')));                y++;            }        Table=new int[y][];        for(int i=0;i<y;i++)        {            int x=Mosty.get(i).size();            Table=new int[x];            for(int j=0;j<x;j++)                Table[j]=Mosty.get(i).get(j);        }                return Table;    }    void print(){        boolean W=false;        System.out.print("{");        for(int[] x:Table)            {            if(W)                System.out.print(",");            W=true;            System.out.print("[");            boolean w=false;                for(int y:x)                {                        if(w)                        System.out.print(",");                    w=true;                    System.out.print(y);                }            System.out.print("]");            }        System.out.println("}");    }}

ملاحظاتي :

  • استخدامك للدالة split جيد جداً لكن الهدف من هذه الحلقات هو التمرن على كتابة أكواد جافا بأفضل طريقة لذا لا أعتقد أن استخدام الدوال الجاهزة سيُساعدنا على إنجاز هذا الهدف.
  • بدلا من إنشاء Vector من Vector من نوع Integer, أعتقد أن انشاء Vector من String يكفي.
  • الخوارزمية التي اتبعتها في كتابة الدالة extraireChiffre كانت قريبة إلى حد ما من تلك التي استخدمُتها, فقط كان من الأفضل أن تستخدم String بدلا من Vector من Integer.
  • بالنسبة للدالة print فلم تُعجبني طريقتك في إظهار العناصر. Table عبارة عن جدول ثنائي البعد من int و إظهار عناصره لا يحتاج إلى كل هذه الحلقات و الجمل الشرطية.

محاولتي :

import java.util.Vector;public class StringsManipulation {    public static int extraireSousChaine(String chaine, String souschaine) {        int count = 0;        for (int i = 0; i < chaine.length(); i++) {            if (chaine.substring(i).startsWith(souschaine)) {                count++;                i += souschaine.length();            }        }        return count;    }    public static int[][] extraireChiffre(String str) {        Vector<StringBuilder> vect = new Vector<>();        StringBuilder tmp = new StringBuilder();        for (int i = 0; i < str.length(); i++) {            if (Character.isDigit(str.charAt(i))) {                tmp.append(str.charAt(i));            } else if (tmp.length() != 0) {                vect.add(new StringBuilder(tmp));                tmp.delete(0, tmp.length());            }        }        if (Character.isDigit(str.charAt(str.length() - 1))) {            vect.add(new StringBuilder(tmp));        }        int tab[][] = new int[vect.size()][];        for (int i = 0; i < vect.size(); i++) {            tab = new int[vect.get(i).length()];            for (int j = 0; j < tab.length; j++) {                tab[j] = Integer.parseInt(Character.toString(vect.get(i).charAt(j)));            }        }        return tab;    }    public static void affiche(int tab[][]) {        for (int[] tabForEach : tab) {            for (int j = 0; j < tabForEach.length; j++) {                System.out.print(tabForEach[j] + " ");            }            System.out.println();        }    }    public static void main(String... args) {        System.out.println("count  = " + extraireSousChaine("Ahmed Mohamed", "med"));        affiche(extraireChiffre("3515AXPOE35145NOEU654"));    }}

بالنسبة للدالة extraireSousChaine, نقوم بالمرور على الجملة chaine حرفاً حرفاً و في كل مرة نتحقق من ما يلي :

إذا كانت souschaine  تبدأ من الموضع الحالي لـ chaine, نقوم بزيادة العداد count ثم ننقل عداد الحلقة إلى نهاية souschaine لنبدأ البحث مرة أخرى و هكذا دواليك ..

 

بالنسبة للدالة extraireChiffre :

  • في البداية, نقوم بإنشاء Vector من StringBuilder أي جدول من الجمل :)
  • الهدف من المتغير tmp هو تخزين المحتوى المؤقت لعناصر vect.
  • ندخل في الحلقة for, إذا كان المحرف الحالي عبارة عن رقم, نقوم يإضافته إلى tmp.
  • إذا كان المحرف الحالي لا يُمثل رقماً فهذا يعني إحدى حالتين : إما وجود حرف يسبقه حرف آخر, في هذه الحالة سيكون طول tmp صفر و بالتالي نعود من جديد إلى بداية الحلقة.
  • الحالة الثانية تعني وجود مجموعة متتالية من الأرقام (حرف يسبقه رقم أو أكثر) و في هذه الحالة سيكون طول tmp أكبر من الصفر بطبيعة الحال لذا, نقوم بإضافة محتوى هذا الأخير إلى عنصر جديد في vect.
  • عند الخروج من الحلقة, هناك حالة خاصة و هي انتهاء الجملة str بمجموعة من الأرقام, في هذه الحالة سيحتوي tmp على تلك الأرقام لذا قمنا بإضافة محتواه إلى vect بعد التأكد من تحقق الشرط.
  • لبناء جدول ثنائي البعد من int, نقوم بجعل عدد الصفوف يُساوي عدد عناصر vect.
  • و طول كل صف يُساوي في كل مرة, طول الجملة المُخزنة في vect لأن كل جملة تحتوي على مجموعة من الأرقام.
  • نقوم بالمرور على مختلف الصفوف, في كل مرة نقوم بتحويل محتوى الجملة الحالية في vect إلى عناصر الصف الحالي في الجدول tab.
  • و أخيراً, نقوم بإعادة جدول ثنائي البعد يحتوي على الأرقام التي ظهرت في الجملة str.

الدالة affiche أعتقد أنها لا تحتاج إلى شرح.

تم تعديل هذه المشاركة بواسطة Snack3r في 25 نوفمبر 2013 في 19:57

#5
اقتباس

 

  • بطبيعة الحال, يُمنع استخدام الدوال الجاهزة بشكل كلي. (تخيل أنك لم تكن تعمل مع StringUtils, كيف ستقوم بكتابة الكود ؟  :) )

هذه API وغيرها علمتنا الكسل

يعني لماذا أتعب نفسي وكل شيء جاهز ؟

 

 

على كل حال لم أكن أعلم أنه يمنع ذلك ^_^

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#6
اقتباس

هذه API وغيرها علمتنا الكسل

يعني لماذا أتعب نفسي وكل شيء جاهز ؟

 

 

نُتعب أنفسنا لكي نتعلم أشياء جديدة فقد نحتاج يوماً ما لكتابة API جديدة .. من يدري ؟ :D

#7

يا أخي حيّرتونا والله !!

نكتب كود منخفض المستوى فتقولون استخدم دوال جاهزة ... نستخدم دوال جاهزة فتقولون اكتب كود منخفض المستوى ...

كل إصدار للّغة تغرقنا الشركات بآلاف الدوال الجديدة .. ونلهث خلفها لمتابعة التطور ..

 

أظن أنني متّفق مع أخي أحمد أبو عبد البر على العبارة التالية " إذا أردت النزول في مستوى الكود فلا تتوقف حتى تصل إلى الأسمبلي .. وإلا فاستعمل كل الأدوات المتاحة "

الخلاصة : إذا كنت مطوّر في جافا أو .Net استخدم كل الأدوات المتاحة ولا تدّخر منها شيئاً طالما تقوم بالمهمّة المطلوبة ... من يريد التفكير فليكتب في C القياسية وليستعمل API النظام مباشرة بدون تغليف ..

هل هناك اعتراض :D

بالتوفيق للجميع

(أنا مش معصّب ...بمثّل بس )

#8
اقتباس

 

أظن أنني متّفق مع أخي أحمد أبو عبد البر على العبارة التالية " إذا أردت النزول في مستوى الكود فلا تتوقف حتى تصل إلى الأسمبلي .. وإلا فاستعمل كل الأدوات المتاحة "

الخلاصة : إذا كنت مطوّر في جافا أو .Net استخدم كل الأدوات المتاحة ولا تدّخر منها شيئاً طالما تقوم بالمهمّة المطلوبة ... من يريد التفكير فليكتب في C القياسية وليستعمل API النظام مباشرة بدون تغليف ..

أنا على هذا الرأي

 

ولذلك فانا لا أتحاشى التعامل بالـ IDE  الكبير في المشاريع الحقيقية مثل netbeans ولا اقول ابدا إن هذا لا يعمل به إلا المبتدئون

 

يعني مطوروه وضعوه للمبتدئين ؟ أكيد لا ولو سمعونا نقول هذا الكلام لربما حاكمونا

 

 

أنا أفهم قصد أخي snacker فهو يريد أن نكتب الكود للتعلم ،  ومن أجل هذا الغرض وضعت هذه الحلقات وانضممنا إليها

تم تعديل هذه المشاركة بواسطة أحمد أبو عبد البر في 25 نوفمبر 2013 في 22:39

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#9

استخدام الأدوات المتاحة أمر ضروري جداً لكن لا يُفيد عند التعلم, نحن هنا لنتعلم .. لذا الإعتماد على الأدوات الجاهزة لن يُفيدنا بشيء.

 

بالنسبة لقصة الأسمبلي, سأكون سعيداً جداً لو قام أحدنا بالإجابة على أسئلة الحلقة الخامسة باستخدام الـ Assembly مع Java :)

تم تعديل هذه المشاركة بواسطة Snack3r في 25 نوفمبر 2013 في 23:37

#10
اقتباس

  • بالنسبة للدالة print فلم تُعجبني طريقتك في إظهار العناصر. Table عبارة عن جدول ثنائي البعد من int و إظهار عناصره لا يحتاج إلى كل هذه الحلقات و الجمل الشرطية.

كانت الشروط والجمل لتنسيق جمالية الخرج :)  جربها وقارنها بالخرج العادي

أخي أحمد أبو عبد البر .. في كودك استخدمت StringUtils.isNumeric وبداخلها substring وكان يكفيك استخدام Character.isDigit  .. وهذا هو مكان التعقيد الذي أشار له Snack3r

@Snack3r

عجبتني هذه :

i += souschaine.length();

حلوة :)

 

بالتوفيق للجميع

__________________

ما قصدك أخي Snack3r في

اقتباس

باستخدام الـ Assembly مع Java

بإمكاني حلّه في كود أسمبلي 16 بت على كيفك .. ما رأيك :)

#11
اقتباس

بإمكاني حلّه في كود أسمبلي 16 بت على كيفك .. ما رأيك ؟

 

 

الحل مطلوب بكود جافا, إذا استطعتَ إدخال كود أسمبلي في كلاس جافا فسأكون سعيداً لرؤية حلك :) (مع العلم أن الأسئلة بسيطة جداً و لا تحتاج إلى إدخال أوامر أسمبلي أو غيرها ..)

#12

وهل يمكن إدخال كود أسمبلي في جافا ×_× .. كنت أقصد كتابة برنامج كامل بالأسمبلي بدون جافا ..

لا أظن أنه يمكن .. لأن الأسمبلي 16 بت تتعامل مع معالج 8086 واخوته .. أما جافا فتتعامل مع آلة جافا الافتراضية .. أليس هذا هو الحال ؟

#13

استخدم الـ JNI, راجع هذا الرابط.

تم تعديل هذه المشاركة بواسطة Snack3r في 27 نوفمبر 2013 في 07:12

#14

رائع .. مدهش .. هذا الـ JNI اختراع هام .. أظن أنني فهمت أخيراً حاجيات الـ native التي أراها في دوال اللغة الرئيسية ..

ولكن لا يمكننا كتابة كود أسمبلي بداخل جافا :D

يمكننا فقط ربط كود الجافا يمكتبة dll وما شابهها ...

الرابط مفيد جداً وفيه روابط أخرى لأشياء مفيدة أيضاً ..

شكراً جزيلاً لك :)

#15
اقتباس
ولكن لا يمكننا كتابة كود أسمبلي بداخل جافا :D

 

 

لهذا السبب قلت لك :

اقتباس
إذا استطعتَ إدخال كود أسمبلي في كلاس جافا فسأكون سعيداً لرؤية حلك :P

 

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…