السلام عليكم
أود السؤال: أمن طريقة لعمل
pass by reference to a method in Java
السلام عليكم
أود السؤال: أمن طريقة لعمل
pass by reference to a method in Java
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
لغة الجافا لا تدعم pass by reference،، لغة الجافا تدعم pass by value فقط. وعموما في رأيي الشخصي،، استخدام pass by reference في أي لغة أخرى هو عمل غير منظم في الغالب!!
ستجد هذه الخاصية في VB و سي شارب.
بالتوفيق!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
شكراً لك
و لكن على حد علمي فإن
pass by reference
تزيد من سرعة البرنامج و تقوم بتوفير الذاكرة بحيث أرسل إلى method the same object or value, not copy from it
since pass by value leads to more memory reservation and more cpu processing
تم تعديل هذه المشاركة بواسطة Final Heaven في 12 يوليو 2006 في 17:49
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
همممم....
فهمت ما تقصد،،، وهو الخطأ الشائع في فهم pass by value و pass by reference، للاختصار pbv و pbr.
أولا،، سأعيد صياغة جوابك لأنه صحيح،، وهو أن استعمال نفس الشيء أو المكون Object دون نسخه يوفر ذاكرة كبيرة، كما أن له فوائد أخرى!
لكن خذ هذه القواعد الأساسية:
1- عندما نتحدث عن pbv و pbr: فإننا نتحدث عن المتغيرات أو المراجع ولا نتحدث عن Object. فالأشياء لا تتغير ولا نستطيع تناقلها سواء بـ pbv أو pbr.
2- لغة الجافا pbv.
3- كثير من الكتب التي تشرح الجافا وقعت خطأ أن جافا تدعم pbr ومن أبرزها كتاب Thinking in Java وقد تدارك ذلك المؤلف في الإصدارات الجديدة. وتوجد مراجع أخرى لنفس الموضوع،، وستجد أن كثير من المواد الدراسية بها هذا الخطأ!
4- pbr موجودة في سي شارب ولغات أخرى،، وهي ميزة لكن لا أنصح استخدامها أبدا لأسباب نتجدث عنها في سياق آخر.
5- تذكر أن الأشياء أو Objects لا يمكننا تناقلها!! وبالأجنبية،، Objects cannot be passed by value neither by reference!! They are not passed at all>
سأضع مثال بسيط عن pbv:
انظر إلى هذه الشفرة البسيطة:
int x=10; int y=20; int c=30; y = x; //pbv
العملية السابقة (نسخنا) قيمة (اكس) ووضعناها في (واي)
ولهذا هي pbv،، كما قلت نسخنا القيمة!
x=1000; غيرنا قيمة x إلى 1000 ،، طبعا y لمم تتغير قيمتها،، لأن كل منهما له نسخة خاصة به.
والآن ننظر إلى المراجع أو References.
Rectangle r=new Rectangle(0,0,4,4);
لاحظ أن r هو عنوان مكان المستطيل الجديد..
بكلمات أخرى، r ليس مستطيلا وإنما هو مرجع إلى مستطيل.
Rectangle r2 = r;
هذه عملية pbv.
لاحظ أننا نسخنا عنوان أو مرجع r ووضعناه في r2.. فكل منهما له نسخة من المرجع،، طبعا كلا المرجعين يشيران إلى نفس المستطيل.
طبعا هذا توضيحي، ونفس الشيء لو أرسلت المرجع إلى طريقة أو method ، فإنها pbv.
وهذا مثال عن pbr وأنصحك بمراجعة سي شارب.
Recagnle r=new Rectangle(); Rectangle r2 = byRef r;
لاحظ هنا أننا لم ننسخ العنوان،، ولكننا نسخنا المرجع نفسه، أو pbr،، ف r2 هي نسخة من r وليس نسخة من العنوان..
يعني:
r2 = null;
يقتضي أن :
(r==null) == true;
أرجو أن الصورة اتضحت!
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
الشكر الجزيل لك و أقدّر لك جهدك في الشرح
لقد عملت على c++ و VB.Net و قد إستخدت pass byref في الكود الخاص بي لإعتقادي بأنه ينمّ عن فهم واضح و كامل للبرمجة من خلال القدرة
على تبسيط الأمور و وضع optimized code و إنتاج برامج بأسرع و أفضل performance، فلدي العديد من الكودات التي أقوم بإستخدامها،
فأنا الآن أقوم بعمل برنامج على الجافا (و أنا متمكّن منها و الحمد لله) و أردت أن أستخدم فيها Tree Datastructure و عندي هذا الكود البسيط
الذي وجدت فكرته و حوّلته إلى c++، و قد أردت أن أستخدمه بالجافا أيضا:
//This Is A Function Insert To The Tree, I sent "X" as constant and by reference
//And Moving On The Tree Recursively Using pass by reference since by value
//the new node will be created and placed in memory out side Tree (not attached to Tree) since a copy
//of the reference (pointer) to the node will be sent through the function (method)
//while by ref it will be created in the same tree class and not copied outside with a copy to reference
void BinarySearchTree::insert(const int & x,BinaryNode * &t)const{
if(t==NULL)
t=new BinaryNode(x,NULL,NULL);
else if(x < t->element)
insert(x,t->left);
else if(x > t->element)
insert(x,t->right);
else
;
}الكود الذي في الأعلى يعتمد على passbyref لذا فلا نسخ تنتج و توضع في recursion stack مما يقلل بشكل هائل حجم الذاكرة المستخدمة و عدا
عن سرعة الأداء و ذلك لعدم وجود نسخ كثيرة في recursive stack لعدم وجود pass by value
لقد قمت بتغيير الكود إلى عادي و ليس تراجعي و لكن تطلّب مني تعديلات عديدة و كبر الكود المستخدم
كما أنني من خلال التجارب على الكود الجديد الذي كتبته أن Tree لا تستطيع أخذ أكثرمن 1000 نود فيها و إلا يحصل
exception stack limit exceeded
و جزاك الله خيراً أتمنّى ألا أكون مزعجاً
تم تعديل هذه المشاركة بواسطة Final Heaven في 12 يوليو 2006 في 22:08
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
أعذروني و لكني بدأت أرى الجافا خسرت قوة داعمة لها لعدم وجود passbyref
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
pbv و pbr تعني أشياء عديدة حسب الشيء الذي نتحدث عنه،،
هل نتحدث عن المتغيرات البسيطة؟ int char boolean،، الخ...وهذه الأنواع كلها value type
هل نتحدث عن structs? طبعا هذا النوع value type
هل نتحدث عن classes? وهذا النوع reference type
شفرة البرنامج الذي أدرجته لا يبين فائدة pbr، صحيح أنك استخدمتها في سي++ لكنك لم تستفد منها إلا قليلا
هذا نفس برنامجك تقريبا بالجافا:
public void insertNodeBasedOnValue(BinaryNode n){
if(value>n.getValue()){
BinaryNode left=getLeft();
if(left!=null){
left.insertNodeBasedOnValue(n);
}
else setLeft(n);
}else{
BinaryNode right=getRight();
if(right!=null){
right.insertNodeBasedOnValue(n);
}
else setRight(n);
}
}لاحظ أنه لا يوجد تناسخ هنا للقيم، ولكن يوجد تناسخ للعناوين،، كل العمليات هنا هي pbv
بالمناسبة،، برنامجك هذا لا يبين فائدة pbr،
يمكنك أن ترى البرنامج كاملا في المرفقات
من الصعب أن تعرف معنى pass by reference إذا بالأصل لم تستخدمها كما يجب.
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
أخي إن أهميّة pass by ref كانت في إرسال node reference بإستخدام pass by ref ليتمكّن class tree من الإمساك بهذا reference
و إضافة new node عندما يصل إلى reference=null و عندها يقوم بإضافة new node to the tree
أما في الكود الذي أعطيتني إياه فإنك تضع كل methods و التي تعمل على مستوى node في class node ذاته مما يزيد من كمية الحجز للذاكرة فعند
كلّ class node تنشأ فإنها ستكون هناك نسخ كثيرة من method insert مثلا في كل node في داخل tree فكيف إن كانت تتألف من عدة methods و غيرها
إن ما أرمي إليه من الكود الذي وضعته هو القدرة على وضع ONE AND ONLY ONE INSERT METHOD و تستخدم من قبل class Tree
لتتحكّ بجميع nodes التي تنشأ عند كلّ زيادة كان إستخدام pass by ref للإمساك بهذا reference الخاص بالنود و إضافته على نود سابقة
فإن كانت النود السابقة نسخة جديد pass by value لما تمكنّا من إضافة new node على node السابقة لها
و إليك هذا الكود لما ابغي و لكنّه لن يعمل لعدم وجود pass by ref و هو التالي:
class Tree {
Node root;
public void insert(int x, Node n) {
if (n == null) {
n = new Node(x, null, null);
} else if (x < n.item) {
insert(x, n.left);
} else if (x > n.item) {
insert(x, n.right);
} else {
;
}
}
class Node {
int item;
Node left;
Node right;
Node(int x, Node l, Node r) {
item = x;
left = l;
right = r;
}
}
}و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
اقتباسأخي إن أهميّة pass by ref كانت في إرسال node reference بإستخدام pass by ref ليتمكّن class tree من الإمساك بهذا referenceو إضافة new node عندما يصل إلى reference=null و عندها يقوم بإضافة new node to the tree
نعم،، صحيح،، أنت استخدمت هنا pbr في شفرة لغة سي،، لكني أقول لك أيضا أن هذا الاستخدام غير مفيد كما تتصور،، فـ pbr فائدتها غير ذلك. وبكلمات أخرى تستطيع أن تصل إلى ما تريد (من مثالك) دون هذه الخاصية.
اقتباسأما في الكود الذي أعطيتني إياه فإنك تضع كل methods و التي تعمل على مستوى node في class node ذاته مما يزيد من كمية الحجز للذاكرة فعندكلّ class node تنشأ فإنها ستكون هناك نسخ كثيرة من method insert مثلا في كل node في داخل tree فكيف إن كانت تتألف من عدة methods و غيرها
همممم،، أنت تقصد أنه توجد الكثير من نسخ ال_methods من كل new تعمله لأي Object جديد،، وهذه لا أدري عنها وسأتأكد!! رغم أن هذا خارج موضوع pbr وفائدتها!
اقتباسإن ما أرمي إليه من الكود الذي وضعته هو القدرة على وضع ONE AND ONLY ONE INSERT METHOD و تستخدم من قبل class Treeلتتحكّ بجميع nodes التي تنشأ عند كلّ زيادة كان إستخدام pass by ref للإمساك بهذا reference الخاص بالنود و إضافته على نود سابقة
فإن كانت النود السابقة نسخة جديد pass by value لما تمكنّا من إضافة new node على node السابقة لها
و إليك هذا الكود لما ابغي و لكنّه لن يعمل لعدم وجود pass by ref و هو التالي:
حسنا،، المثال التالي يستخدم ONE AND ONLY ONE INSERT METHOD كما تريد دون استخدام pbr وتستخدم من الفئة Tree !
public BinaryNode treeInsert(int x, BinaryNode n){
if(n==null)return new BinaryNode(x);
if(x<n.getValue())n.setLeft(treeInsert(x, n.getLeft()));
if(x>n.getValue())n.setRight(treeInsert(x, n.getRight()));
return n;
}وهذا هو خرج البرنامج باستخدام الأسلوب الأول (التحكم من خلال NOde :من Node إلى Node)
والأسلوب الثاني التحكم من خلال Tree
[code] test1: Using Node to Node [*<50>*] [*<50>[*<60>*]] [*<50>[*<60>[*<70>*]]] [*<50>[[*<55>*]<60>[*<70>*]]] [[*<40>*]<50>[[*<55>*]<60>[*<70>*]]] [[*<40>*]<50>[[*<55>*]<60>[[*<65>*]<70>*]]] test2: Using Tree as Control [*<50>*] [*<50>[*<60>*]] [*<50>[*<60>[*<70>*]]] [*<50>[[*<55>*]<60>[*<70>*]]] [[*<40>*]<50>[[*<55>*]<60>[*<70>*]]] [[*<40>*]<50>[[*<55>*]<60>[[*<65>*]<70>*]]] Press any key to continue...
وفي المرفقات تجد البرنامج كاملا
تم تعديل هذه المشاركة بواسطة حسام الملحم أبومازن في 13 يوليو 2006 في 19:45
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
لقد أعجبتني فكرة إرجاع reference الخاص بكلّ object أنشأ في الذاكرة بعد إرساله إلى method (حيث تصنّع نشخة عنه) معين فإنها تغني بشكل بسيط و جزئي عن pbr
و التي نجحت في هذه الحاله مع أن في كلّ مرة نقوم ب overwrite على كل reference أمرّ بها لأنه في كلّ مرة تنشأ نسخة عن object المرسل في حال
إرساله إلى method و الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة لوجود العديد من objects في الذاكرة حتى أصل إلى
null فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
جميل و لكنّ هل بالإمكان تطبيق نفس الأسلوب لعمل method delete من دون الحاجة إلى pbr لقد عملت على هذا و دخلت في متاهة، و إليك ما أرمي إليه
من كود c++:
void BinarySearchTree::remove(const int & x,BinaryNode * &t)const{
if(t==NULL)
return;
if(x < t->element)
remove(x,t->left);
else if(x > t->element)
remove(x,t->right);
else if(t->left!=NULL && t->right!=NULL){
t->element=findMin(t->right)->element;
remove(t->element,t->right);
}
else{
BinaryNode *oldNode=t;
t=(t->left!=NULL)?t->left:t->right;
delete oldNode;
}
}أنظر إلى سهولة الكود المكتوب و أساسه إستخدام pbr
و لكن إستطعت التوصل إلى كود سهل من دون إستخدام الكود التراجعي و لا stack للقيام بعمليّة Tree و دون الحاجة إلى pbr و بصراحة لولا مشكلة الجافا
لعدم وجود pbr لما فكّرت بها و هي على الشكل التالي:
void insert(int obj) {
if (root != null) {
insert(obj, root);
}
else {
root = new Node(obj);
}
}
void insert(int obj, Node t) {
boolean end = true;
Node cur = t;
while (end) {
if (cur == null) {
t = new Node(obj);
end = false;
}
else if (cur.element > obj && cur.left == null) {
cur.left = new Node(obj);
end = false;
}
else if (cur.element < obj && cur.right == null) {
cur.right = new Node(obj);
end = false;
}
else if (cur.element > obj) {
cur = cur.left;
}
else if (cur.element < obj) {
cur = cur.right;
}
else {
end = false;
}
}
}و الشكر الجزيل لك على أية حال
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
قبل أن أحاول إجابة طريقة عمل delete أو remove،، أحب أن أوضح شيئا حاولت أو أوضحه في الردود السابقة، ولكن يبدو أني لم أكن واضحا:
بالنسبة للجافا:
1- الأشياء أو Objects (((لا تنسخ، ولا تتناقل))). يعني لا تخاف على الذاكرة!!
2- المرجعيات هي التي تنسخ بالقيمة فقط، وهذه لا تؤثر في الذاكرة!!
وبالأجنبية:
Objects are NOT Passed By Reference. Objects are NOT Passed by Value. Objects are NOT PASSED AT ALL. Primitave are passed by Value. Object REFERENCES are passed by Value.
لاحظ أن فائدة Pass By Reference الموجودة في سي شارب وسي وغيرهما، تكمن في إمكانية إرجاع أكثر من قيمة من خلال أمر معين! وإليك مثال:
public static void calcualte(int x, int y, byref int sum, byref int power, byref int subt, byref double division){
sum=x+y;
subt=x-y;
power=x*y;
division=x/y;
}
public static void test(){
int sum=0;
int power=0;
int sub=0;
int div=0;
calculate(6,3,sum, power, sub, div);
Consolo.WriteList(sum+""+power+" "+div+" "+ etccccc....);
}لاحظ أن هذه العملية هي void لكنها حقيقة ترجع أكثر من قيمة ..
لاحظ أيضا أنها أسلوبها غير نظامي في استرجاع المعلومات،،
هذه أكبر فائدة ل Pass By Reference وهي أننا نستطيع أن نرجع أكثر من قيمة.
1- Pass By Reference موجودة قديما في لغات قديمة،، وكنت أعهدها في QBasic !!
2- تعتبر Pass By Reference غير نظامية، حيث أنها تصعب من فهم الشفرة.
3- إذا أردت استخدام Pass By Reference في مشروعك في لغة سي،، فأنصحك أن تقلل استخدامها قدر الإمكان،، واجعلها فقط في أوامر private،، كي لا تستخدمها إلا وأنت على يقين بأنك لن تسيء استخدامها!
4- خطر Pass By Reference كبير، إذا لم تكن دقيقا،، مما يصعب عليك العثور على الأخطاء!
5- الأمثلة التي ذكرتها لا تتطلب Pass By Reference،، لأن الأمثلة لا تتطلب إرجاع أكثر من قيمة.
6- مصممو الجافا نظاميون، ولم يريدون Pass By Reference لهذه الأسباب وأسباب أخرى ربما!
Microsoft أضافت pbr إلى سي شارب،، وأعتقد أنها دعاية فقط أنها تدعم ذلك،، وإذا بحثت عن فوائد pbr عندهم لوجدتها شحيحة!! يعني حتى هم لا ينصحونك باستخدامها! وسترى أمثلة swap في كل مكان وكأنها المشكلة التي نبحث عن حل لها من آلاف السنين!
في الرد التالي سأحاول إدراج طريقة عمل delete بإذن الله.
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
قد ذكرت في مشاركتك السابقة:
اقتباسأنظر إلى سهولة الكود المكتوب و أساسه إستخدام pbr
قل لي برأيك ماهو الأسهل في عملية insert شفرتك أو الشفرة التي أدرجتها؟
شفرة سي:
اقتباسvoid BinarySearchTree::insert(const int & x,BinaryNode * &t)const{ if(t==NULL) t=new BinaryNode(x,NULL,NULL); else if(x < t->element) insert(x,t->left); else if(x > t->element) insert(x,t->right); else ; }
شفرة جافا:
public BinaryNode treeInsert(int x, BinaryNode n){
if(n==null)return new BinaryNode(x);
if(x<n.getValue())n.setLeft(treeInsert(x, n.getLeft()));
if(x>n.getValue())n.setRight(treeInsert(x, n.getRight()));
return n;
}وقل لي برأيك ما هو أسهل وأوضح؟ شفرتك سي أو شفرة الجافا التالية لعملية الحذف؟
اقتباسvoid BinarySearchTree::remove(const int & x,BinaryNode * &t)const{ if(t==NULL) return; if(x < t->element) remove(x,t->left); else if(x > t->element) remove(x,t->right); else if(t->left!=NULL && t->right!=NULL){ t->element=findMin(t->right)->element; remove(t->element,t->right); } else{ BinaryNode *oldNode=t; t=(t->left!=NULL)?t->left:t->right; delete oldNode; } }
شفرة جافا:
public BinaryNode treeDelete(int x, BinaryNode n){
if(n==null)return null;
if(n.getValue()==x)return null;
if(x<n.getValue())n.setLeft(treeDelete(x, n.getLeft()));
if(x>n.getValue())n.setRight(treeDelete(x, n.getRight()));
return n;
}تجد في المرفقات شفرة الجافا لتجربة عملية الحذف:
نعقيب آخر على المشاركة رقم 10:
اقتباسو الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة لوجود العديد من objects في الذاكرة حتى أصل إلىnull فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
مجمع النفايات أو Garbage Collector لا يعمل في شفرة الجافا التي أدرجتها! لأنه لا توجد أشياء لم تستعمل! ولا يوجد تناسخ في الأشياء،، ولا يوجد العديد من الـ Objects حتى يبدأ GC بالعمل!
يعني حتى لو لم يوجد GC في شفرتي لما كان كارثة،، وإن أردت، يمكننا التحقق من هذا بسهولة باستعمال finanalize. وإن أردت مثالا فلا تتردد في السؤال.
نعقيب آخر على المشاركة رقم 10:
اقتباسو الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة لوجود العديد من objects في الذاكرة حتى أصل إلىnull فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
مجمع النفايات أو Garbage Collector لا يعمل في شفرة الجافا التي أدرجتها! لأنه لا توجد أشياء لم تستعمل! ولا يوجد تناسخ في الأشياء،، ولا يوجد العديد من الـ Objects حتى يبدأ GC بالعمل!
يعني حتى لو لم يوجد GC في شفرتي لما كان كارثة،، وإن أردت، يمكننا التحقق من هذا بسهولة باستعمال finanalize. وإن أردت مثالا فلا تتردد في السؤال.
نعقيب آخر على المشاركة رقم 10:
اقتباسو الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة لوجود العديد من objects في الذاكرة حتى أصل إلىnull فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
مجمع النفايات أو Garbage Collector لا يعمل في شفرة الجافا التي أدرجتها! لأنه لا توجد أشياء لم تستعمل! ولا يوجد تناسخ في الأشياء،، ولا يوجد العديد من الـ Objects حتى يبدأ GC بالعمل!
يعني حتى لو لم يوجد GC في شفرتي لما كان كارثة،، وإن أردت، يمكننا التحقق من هذا بسهولة باستعمال finanalize. وإن أردت مثالا فلا تتردد في السؤال.
نعقيب آخر على المشاركة رقم 10:
اقتباسو الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة لوجود العديد من objects في الذاكرة حتى أصل إلىnull فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
مجمع النفايات أو Garbage Collector لا يعمل في شفرة الجافا التي أدرجتها! لأنه لا توجد أشياء لم تستعمل! ولا يوجد تناسخ في الأشياء،، ولا يوجد العديد من الـ Objects حتى يبدأ GC بالعمل!
يعني حتى لو لم يوجد GC في شفرتي لما كان كارثة،، وإن أردت، يمكننا التحقق من هذا بسهولة باستعمال finanalize. وإن أردت مثالا فلا تتردد في السؤال.
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
نعقيب آخر على المشاركة رقم 10:
اقتباسو الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة لوجود العديد من objects في الذاكرة حتى أصل إلىnull فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
مجمع النفايات أو Garbage Collector لا يعمل في شفرة الجافا التي أدرجتها! لأنه لا توجد أشياء لم تستعمل! ولا يوجد تناسخ في الأشياء،، ولا يوجد العديد من الـ Objects حتى يبدأ GC بالعمل!
يعني حتى لو لم يوجد GC في شفرتي لما كان كارثة،، وإن أردت، يمكننا التحقق من هذا بسهولة باستعمال finanalize. وإن أردت مثالا فلا تتردد في السؤال.
صفحاتي: صفحة حسام الملحم www.hussam.ws مدونة
آخر المشاريع: مشروع لغة برمجة عربية شيئية التوجه
ألعاب على الجوال : 1-(لعبة O X على الجوال ) 2-(لعبة الرقم السري على الجوال ) 3-(لعبة آخر حبة على الجوال )
ألعاب على الحاسب: لعبة الوزراء الثمان ، لعبة شطرنج ، لعبة التركيب Tetris
مواضيعي:
الفرق الجذري بين الجافا و C# شرح التعامل مع WTK لبرمجة الجوالات
مشاركاتي:
برنامج (كاتب) للكاتب فهد OMLX، برنامج (المحول) للكاتب فهد OMLX، برنامج (Unit Storm) للكاتب بشير C&Dell، أيهما أكبر الأعداد الصحيحة أم الطبيعية للكاتب Romanof، سؤال رياضي بحت للكاتب VB6-Rocket، التحدي الكبير للكاتب ANSI،
أعتذر عن خطئي في الشرح
ما أرمي إليه هو النسخ الكثير ل reference و أعترف بأن كلامي عن objects هو خطأ فظيع لنسياني لمقطع لم أنتيه عدم كتابته
و الكلام الذي كنت أنوي كتابته هو:
و الرائع في الموضوع هو وجود garbage collector و إلا كان الكود كارثة كما c++ لوجود العديد من objects في الذاكرة حتى أصل إلى
null فأنشأ object جديد و أعيد reference الخاص به ليعمل overwrite على null
و الذي هو إستخدام delete عند كل Allocation و الذي قد تحدث أخطاء كثيرة إن أخطأت إستخدامها
و أعترف بخطئي لأنني لم اراجع ما كتبت
و أعتذر إلى زوّار المنتدى على عدم حرصي على مراجعة ما كتبت و تصحيح أي خطأ عرضي دون إنتباه منّي
و الله ولي التوفيق
تم تعديل هذه المشاركة بواسطة Final Heaven في 16 يوليو 2006 في 19:39
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
السلام عليكم
لقد قررت إكمال BinarySearchTree بأسلوب Recursion و وضعها لمن يستفيد منها، فقد قمت بإستخدام أسلوب الأخ الفاضل حسام
و الذي إرجاع كلّ reference مرسلة دون الحاجة إلى إستخدام pass by reference و التي بصراحة حتى الآن أرى بأن pass by reference قوة لا يستهان بها
لأي لغة برمجة،
و لكن أوّلا أريد التنبيه على عدم إكتمال آخر كود وضعه الأخ حسام method delete و ذلك لأنها تعمل في حالة معيّنة فقط
tree.treeDelete(40); System.out.println(tree); Answer:---------------------->> [*<50>[[*<55>*]<60>*]] tree.treeDelete(66); //أنظر هنا 66 و التي ليست موجودة في Tree System.out.println(tree); Answer:---------------------->> [*<50>[[*<55>*]<60>*]] tree.treeDelete(50); //أنظر هنا و لكن Tree مازالت ممتلئة System.out.println(tree); Answer:---------------------->> tree is empty.
ثانيا سأقوم الآن بوضع الكود و أتمنى من يصل إلى method delete بطريقة recursion أفضل من التي وضعتها أتمنى منه وضعها ليستفيد منها الجميع
و الآن إليكم
Class Node
---------------
public class Node {
private Object item;
private Node left, right;
Node(Object obj) {
item = obj;
left = null;
right = null;
}
Node(Object obj, Node lf, Node rt) {
item = obj;
left = lf;
right = rt;
}
public void setItem(Object it) {
item = it;
}
public Object getItem() {
return item;
}
public void setLeft(Node lf) {
left = lf;
}
public Node getLeft() {
return left;
}
public void setRight(Node rt) {
right = rt;
}
public Node getRight() {
return right;
}
}Class JavaBinaryTree
---------------------------
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
public final class JavaBinaryTree
extends JFrame {
private static final int FRAME_WIDTH = 500, FRAME_HEIGHT = 501;
private JTextArea textArea;
private Node root;
private final Object ITEM_NOT_FOUND;
private Toolkit tk;
private Dimension dm;
private Node previousNode;
private Object checkedObject;
private String referenceNodeDirection;
public JavaBinaryTree(Object itemnotfound) {
root = null;
previousNode = null;
referenceNodeDirection = null;
ITEM_NOT_FOUND = itemnotfound;
tk = Toolkit.getDefaultToolkit();
dm = tk.getScreenSize();
setLayout(new BorderLayout());
setBackground(Color.GRAY);
textArea = new JTextArea();
textArea.setBackground(Color.white);
textArea.setForeground(Color.BLACK);
textArea.setLineWrap(true);
add(new JScrollPane(textArea), BorderLayout.CENTER);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds((dm.width - FRAME_WIDTH) / 2, (dm.height - FRAME_HEIGHT) / 2, FRAME_WIDTH,
FRAME_HEIGHT);
}
public boolean isEmpty() {
return root == null;
}
public void makeEmpty() {
if (root.getLeft() == null && root.getRight() == null) {
root = null;
}
else {
root = makeEmpty(root);
}
}
private Node makeEmpty(Node temp) {
temp.setLeft(makeEmpty(temp.getLeft()));
temp.setRight(makeEmpty(temp.getRight()));
return null;
}
public Object findMin() {
return elementAt(findMin(root));
}
private Node findMin(Node temp) {
if (temp == null) {
return null;
}
else if (temp.getLeft() == null) {
return temp;
}
else {
return findMin(temp.getLeft());
}
}
public Object findMax() {
return elementAt(findMax(root));
}
private Node findMax(Node temp) {
if (temp == null) {
return null;
}
else if (temp.getRight() == null) {
return temp;
}
else {
return findMax(temp.getRight());
}
}
public Object find(Object obj) {
return elementAt(find(obj, root));
}
private Node find(Object obj, Node temp) {
if (temp == null) {
return null;
}
else if (obj.toString().compareTo(temp.getItem().toString()) < 0) {
return find(obj, temp.getLeft());
}
else if (obj.toString().compareTo(temp.getItem().toString()) > 0) {
return find(obj, temp.getRight());
}
else {
return temp;
}
}
public void insert(Object obj) {
root = insert(obj, root);
}
private Node insert(Object obj, Node temp) {
if (temp == null) {
temp = new Node(obj);
}
else if (temp.getItem().toString().compareTo(obj.toString()) > 0) {
temp.setLeft(insert(obj, temp.getLeft()));
}
else if (temp.getItem().toString().compareTo(obj.toString()) < 0) {
temp.setRight(insert(obj, temp.getRight()));
}
return temp;
}
public void delete(Object obj) {
if (root == null) {
textArea.append("The Tree You Are Deleting From Is Empty\n\n");
}
else {
root = delete(obj, root);
}
}
private Node delete(Object obj, Node temp) {
if (temp == null) {
textArea.append("The Item To be Deleted Not Found In The Tree\n\n");
}
else if (temp.getItem().toString().compareTo(obj.toString()) > 0) {
temp.setLeft(delete(obj, temp.getLeft()));
}
else if (temp.getItem().toString().compareTo(obj.toString()) < 0) {
temp.setRight(delete(obj, temp.getRight()));
}
else if (temp.getLeft() != null && temp.getRight() != null) {
temp.setItem(checkedObject = findMin(temp.getRight()).getItem());
temp.setRight(delete(obj, temp.getRight()));
checkLeaves(checkedObject, temp.getRight());
}
else {
temp = (temp.getLeft() != null) ? temp.getLeft() : temp.getRight();
}
return temp;
}
private void checkLeaves(Object obj, Node temp) {
if (temp == null) {
;
}
else if (temp.getItem().toString().compareTo(obj.toString()) > 0) {
previousNode = temp;
referenceNodeDirection = "left";
checkLeaves(obj, temp.getLeft());
}
else if (temp.getItem().toString().compareTo(obj.toString()) == 0 && temp.getLeft() == null &&
temp.getRight() == null) {
if (referenceNodeDirection.equals("left")) {
previousNode.setLeft(null);
}
else if (referenceNodeDirection.equals("right")) {
previousNode.setRight(null);
}
}
else if (temp.getItem().toString().compareTo(obj.toString()) < 0 ||
temp.getItem().toString().compareTo(obj.toString()) == 0) {
previousNode = temp;
referenceNodeDirection = "right";
checkLeaves(obj, temp.getRight());
}
}
public void printTree() {
if (root == null) {
textArea.append("The Binary Search Tree Is Empty\n\n");
}
else {
printTree(root);
}
}
private void printTree(Node temp) {
if (temp == root) {
textArea.append("The Tree Elements Are:\n");
}
if (temp != null) {
textArea.append("" + temp.getItem() + " ");
printTree(temp.getLeft());
printTree(temp.getRight());
}
if (temp == findMax(root)) {
textArea.append("\n\n");
}
}
private Object elementAt(Node temp) {
return (temp == null) ? ITEM_NOT_FOUND : temp.getItem();
}
public static void main(String[] FinalHeaven) {
JavaBinaryTree jbt = new JavaBinaryTree( -1);
jbt.validate();
jbt.insert(new Integer(50));
jbt.insert(new Integer(60));
jbt.insert(new Integer(40));
jbt.insert(new Integer(45));
jbt.insert(new Integer(55));
jbt.printTree();
jbt.delete(new Integer(50));
jbt.printTree();
jbt.delete(new Integer(60));
jbt.printTree();
jbt.delete(new Integer(40));
jbt.printTree();
jbt.delete(new Integer(45));
jbt.printTree();
jbt.delete(new Integer(55));
jbt.printTree();
jbt.delete(new Integer(80));
}
}و هاهي لكم في المرفقات أيضاً
تم تعديل هذه المشاركة بواسطة Final Heaven في 28 يوليو 2006 في 20:43
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
السلام عليكم
في الأيام الأخيرة قمت بتصميم برنامج لمادة Natural Language Processing
و إحتجت فيها لل AVL Tree و قمت بتصميمها معتمدا على Binary Tree هذه التي وضعتها سابقا
و بصراحة قد كانت فيها عملية غير مقنعة خلال Method Delete مما إضطرني إلى إضافة checkLeaves Method
تعتمد عليها Delete لتتم بشكل سليم في حالة معينة و بصراحة لم أكن مقتنعا بما يحصل من خطأ من دون ما أضفته
لأن ما أضفته أضاف تكلفة كبيرة على عملية Delete و جعلها سيئة بشكل كبير فهي من دون شئ تعتمد على Recursion في عملها
فتستخدم Stack و هي أبطأ من الكود العادي و لكن و الحمد لله حلت المشكلة و التي كان سببها سهوي عن Input خاطئ أقوم بإرساله
في إحدى الحالات الخاصة ب Delete سبحان الله كم مرة قرأت الكود و لم انتبه لهذا إلا الآن، الحمد لله على كل شئ
و هذه method Delete مع التصحيح:
public void delete(Object obj) {
if (root == null) {
textArea.append("The Tree You Are Deleting From Is Empty\n\n");
}
else {
root = delete(obj, root);
}
}
private Node delete(Object obj, Node temp) {
if (temp == null) {
textArea.append("The Item To be Deleted Not Found In The Tree\n\n");
}
else if (temp.getItem().toString().compareTo(obj.toString()) > 0) {
temp.setLeft(delete(obj, temp.getLeft()));
}
else if (temp.getItem().toString().compareTo(obj.toString()) < 0) {
temp.setRight(delete(obj, temp.getRight()));
}
else if ((temp.getLeft() != null) && (temp.getRight() != null)) {
temp.setItem(checkedObject = findMin(temp.getRight()).getItem());
temp.setRight(delete(temp.getItem(), temp.getRight()));
}
else {
temp = (temp.getLeft() != null)
? temp.getLeft()
: temp.getRight();
}
return temp;
}و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
أبو مازن
class methods لاتنسخ في كل أوبجكت هي behaviour إي أن جميع Objects يشتركون فيها !
فهي تخزن في Stack ليست في الHeap ، اتمنى ان تكون معلوماتي صحيحه !
بالمناسبه لايمكنك الحكم على GC من خلال finalize فهي قد تستدعى وقد لاتستدعى ،
الشئ الآخر ليس بكل الامور يكون الاوبجكت eligable for GC حتى لو وضعنا الريفرنس = null
هنا كان التعديل
else if ((temp.getLeft() != null) && (temp.getRight() != null)) {
temp.setItem(findMin(temp.getRight()).getItem());
كنت أرسل الأوبجكت المرسل و هذا خطأ لا أعلم كيف لم انتبه لهذا سبحان الله
فهنا علي إرسال ما أحضرته من العلملية السابقة و التي تأتي بأصغر أبجكت من الجهة اليمنى
و كان هذا الخطأ الذي لم أنتبه له في كتابتي للكود
ي
temp.setRight(delete(temp.getItem(), temp.getRight()));
}تم تعديل هذه المشاركة بواسطة Final Heaven في 2 مايو 2007 في 18:12
و كن فتى في ذرى العلياء همّته
موقع خاص بي
قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا
برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل
هذا الموضوع مغلق.