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

Changing The Class To Be Like Generic: CompareTo Problem

مغلق
بدأه Final Heaven في 8 يوليو 2007 · 14 رد · 1,687 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لقد قمت بتصميم AVLTree و بصراحة أستخدمها كثيرا و في كل مرّة أقوم بالتعديل عليها كي تناسب برامجي

و أردت تحويلها كي تعمل مثل Generics و لكن واجهت مشكلة ألا و هي عملية CompareTo بين Objects

و لا أجد سوى equals و لكنني أحتاج إلى CompareTo فهل من طريقة لعمل هذا؟

و بهذه الطريقة في حالة إستخدام أي Object ليكون في Tree عليه أن يكون Implement Comparable

و لكن أريد إستخدام هذه Comparable التي في Objects التي تدخل إلى Tree فيها ؟

تم تعديل هذه المشاركة بواسطة Final Heaven في 8 يوليو 2007 في 07:51

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#2

ممكن توضح السؤال أكتر ؟؟

زي ما يبدو إنك عارف ، خلي كل فئه ت implement الواجهه Comparable و عرف الداله compareTo لهذه الفئه .

#3

لم افهم المشكله بالضبط ، ولكن بامكانك استخدام Comparator interface

بالمناسبه هل حاولت إستخدام الفئه JTree ؟

#4

هذه ال AVLTree التي قمت بتصميمها

جربوا تحويلها إلى Generic مثل ArrayList أو غيرها كي تستخدم على هذا الشكل مثلا

AVLBinaryTree<Integer> avl=new AVLBinaryTree<Integer>(-1);

و هذا هو الكود الذي أستخدمه:

binarysearchtree.zip

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#5

السلام عليكم

لقد قمت بتحويل الفئه Node وذلك لصغر حجمها ، و معها مثال مرفق عليها

 1  package binarysearchtree;
 2
 3  //~--- classes ----------------------------------------------------------------
 4
 5  public class Node<T> {
 6	  //~--- fields -------------------------------------------------------------
 7
 8	  private T item;
 9	  private int	 height;
10	  private Node<T>	left, right;
11
12	  //~--- constructors -------------------------------------------------------
13
14	  Node(T obj) {
15		  item   = obj;
16		  left   = null;
17		  right  = null;
18		  height = 0;
19	  }
20
21	  //~--- set methods --------------------------------------------------------
22
23	  public void setItem(T it) {
24		  item = it;
25	  }
26
27	  //~--- get methods --------------------------------------------------------
28
29	  public T getItem() {
30		  return item;
31	  }
32
33	  //~--- set methods --------------------------------------------------------
34
35	  public void setLeft(Node lf) {
36		  left = lf;
37	  }
38
39	  //~--- get methods --------------------------------------------------------
40
41	  public Node getLeft() {
42		  return left;
43	  }
44
45	  //~--- set methods --------------------------------------------------------
46
47	  public void setRight(Node rt) {
48		  right = rt;
49	  }
50
51	  //~--- get methods --------------------------------------------------------
52
53	  public Node getRight() {
54		  return right;
55	  }
56
57	  //~--- set methods --------------------------------------------------------
58
59	  public void setHeight(int h) {
60		  height = h;
61	  }
62
63	  //~--- get methods --------------------------------------------------------
64
65	  public int getHeight() {
66		  return height;
67	  }
68  }

مثال عليها :

 1  package binarysearchtree;
 2
 3  public class TestNode {
 4
 5		  public static void main (String[] args){
 6
 7				  Node<String> n = new Node<String>("root");
 8				  String str = n.getItem();
 9
10				  System.out.println ( str);
11
12				  Node<Integer> n2 = new Node<Integer>(30);
13				  Node<Integer> n3 = new Node<Integer>(10);
14				  n2.setLeft(n3);
15
16				  Node<Integer> n4 = n2.getLeft();
17				  int x = n4.getItem();
18
19				  System.out.println (x);
20		  }
21  }
#6

عمل كلاس Node ك Generic سهل جدا و ليس هذا مغزى سؤالي أبدا

بل الأساس هو AVLBinaryTree

و خاصة عند حالات الأكبر و الأصغر و التي أحتاج فيها إلى عمل مقارنة بين Objects

و التي هي CompareTo و هنا يكمن أساس سؤالي

و شكرا لكم على التجاوب

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#7

the problem is in the hugeness of this class :s :s

I think i can help but it may talk too long time

sorry for writing in english :D

#8

هل بحثت عن Comparator ؟

#9

أولا شكرا على تجاوبكم

ثانيا لا مشكلة لدي في اللغة الإنجليزية فدراستي كلها بالإنجليزية

ثالثا سأحاول توضيح مرادي أكثر:

مرادي من هذا كله هو القدرة على إستخدام اي Object في AVLBinaryTree و كما نرى من الكود فلدي عدة

مقارنات داخل عدة methods فعلي المقارنة إن كانت أكبر أو أصغر أو تساوي. و لكن لا أجد في Object class

سوى equals و لا حتى في E أو T. فلو أقدر على إستخدام CompareTo فيها و بذلك يتوجب على كل كلاس

كي يستخدم في AVLBinaryTree أن يعرف CompareTo أي أن يكون implement Comparable أو حتى

Comparator و أستخدم compare و لكن المشكلة هي كيف

قرأت ArrayList و غيرها و لكن كلها تستخدم equals فقط

أتمنى أن تكون الصورة المرجوّة قد توضحت أكثر

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#10

موش المقارنات دي تتم بين ال Nodes ????

أعبقد أيوا ، لو كده ؛ خلي ال Node ت implement الواجهه Comparable

***

أعتقد كده إنت عاوز حاجتين :

١- عاوز تخلي الشجره بتاعتك تستقبل أي كائنمن أي نوع <======= Generics

٢- عاوز تقارن بين الكائنات بإستخدام Comparable.compareTo(Objct o ) <=== خلي بالك البارامتر لازم يكون Object ، ميتفعش يكون T

أعتقد الطلب الثاني ممكن يتعمل من غير المساس بالطلب الأول

جار المحاوله

#11

حتى الآن لم أصل إلى الطريقة

أظن أن هناك معلومة تنقصنا

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#13

Salam 3liekom my brother Final Heaven.I khnow what u mean,and i found the solution.U should implement Comparable in class Node like this:

public class Node implements Comparable{

.

.

.

public int compareTo(Object o)

{

if(this.item>((Node) o).item)

return 1;

else if(this.item==((Node) o).item)

return 0;

else

return -1;

}

}

and when u want to compare two nodes i use this demo class to implement the Compare function:

public class MyList<T> {

private T Tail;

private int count;

public MyList(){

head=null;

Tail=null;

count=0;

}

public MyList(T obj) {

head = obj;

}

public void Insert(T item)

{

if(head==null)

{

head=item;

}

}

public int Compare(T LeftItem)

{

Comparable RightSide= (Comparable)this.head ;

Comparable LeftSide= (Comparable)LeftItem;

return

RightSide.compareTo(LeftSide);

}

}

as u see the Compare(T LeftItem) i make casting of the T type into interface comparable

and this allows me to use compareTo function .

and the main function like this:

public class Main {

public static void main(String[] args) {

Node x=new Node(4);

Node y=new Node(7);

MyList<Node> L2=new MyList<Node>(x);

int result= L2.Compare(y);

JOptionPane.showMessageDialog(null, result, "Error", JOptionPane.ERROR_MESSAGE);

}

}

تم تعديل هذه المشاركة بواسطة TheITMuslim في 14 ديسمبر 2007 في 15:09

#14

مشكور أخي وصلت الفكرة، و أهلا بك في المنتدى

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

#15

الحمد لله أعتقد أنني أنهيتها و لكن أتمنى ممن لديه أية إضافات أو إقتراحات أن يتكرّم بها

و هذا هو ملف AVL Binary Search Tree :

src.zip

JavaDoc:

javadoc.zip

و إستخدامه كالتالي، تضيف الملف في برنامجك ثمّ:

AVLBinaryTree<Integer> avl=new AVLBinaryTree<Integer>();
for(int i=0; i<10; i++){
	avl.add(i);
}

System.out.print(avl.printTree());

for(int i=0; i<10; i++){
	avl.remove(i);
}

System.out.print(avl.printTree());

و كما و نقدر على جعل AVL تقبل تكرار الأعداد أو غيرها من Objects عن طريق الكود:

AVLBinaryTree<Integer> avl=new AVLBinaryTree<Integer>(true);

OR

avl.setDuplicates(true);

و كما و أقدر على تحديد كيفية ترتيب Objects في printTree أو في toArray بتحديد Order و نرى ذلك:

System.out.print(avl.printTree(AVLBinaryTree.INORDER)); //which is the default one in the tree

AND

Integer[] array=avl.toArray(new Integer[avl.getSize()] , AVLBinaryTree.INORDER);

و هنا نرى كيف نستخدم Object من صنعنا في AVL و هنا نرى عدّة شروط:

على Object أن يكون implements الكلاس Comparable

و تستخدم ToString من أجل طباعة ما بداخل AVLTree إن أراد إستخدام printTree method

public class Employee implements Comparable {
	//~--- fields -------------------------------------------------------------

	private int	id;
	private String name;

	//~--- constructors -------------------------------------------------------

	public Employee(int id, String name) {
		this.id   = id;
		this.name = name;
	}

	//~--- methods ------------------------------------------------------------

	public int compareTo(Object o) {
		int thisID  = this.id;
		int otherID = ((Employee) o).getId();

		return (thisID < otherID)
			   ? -1
			   : (thisID == otherID)
				 ? 0
				 : 1;
	}

	@Override
	public String toString() {
		return name;
	}

	//~--- get methods --------------------------------------------------------

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	//~--- set methods --------------------------------------------------------

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}
}

و نرى كيفية الإستخدام ها هنا:

AVLBinaryTree<Employee> avl=new AVLBinaryTree<Employee>();

Employee e1=new Employee(1, "Khaled");
Employee e2=new Employee(2, "Ahmad");
Employee e3=new Employee(3, "Ali");
Employee e4=new Employee(4, "Hussein");
Employee e5=new Employee(6, "Omar");

avl.add(e1);
avl.add(e2);
avl.add(e3);
avl.add(e4);
avl.add(e5);

System.out.print(avl.printTree());

و النتيجة:

Khaled
Ahmad
Ali
Hussein
Omar

و الله وليّ التوفيق

تم تعديل هذه المشاركة بواسطة Final Heaven في 21 ديسمبر 2007 في 22:45

و كن فتى في ذرى العلياء همّته

يسمو بغاياته حتى على زحل

موقع خاص بي

My Website

قمت بتصميم لعبة بسيطة بإستخدام اللغة الجميلة الجافا

Plane Fighter Game

برنامج جميل بلغة الجافا يساعد على تنظيم المشاكل

The TS Organizer

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

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