يعد تبديل الكائنات أحد أكثر الإجراءات شيوعًا في البرمجة. إنها مفيدة بشكل خاص في الفرز. ما يحدث في المبادلة هو أن متغيرين يتبادلان قيمهما. في هذه المقالة، نتعلم كيفية تبديل الكائنات في Java في حالتين مختلفتين. أحدهما هو مبادلة كائنات مستقلة والآخر هو مبادلة كائنين في قائمة أو صفيف. دعونا أولاً نفحص مبادلة الكائنات المستقلة.
يختلف تبديل الكائنات عن تبديل أنواع البيانات البدائية
إحدى الطرق الشائعة المستخدمة لمبادلة القيم الأولية هي استخدام متغير زمني. ومع ذلك، فأنت تعلم أن Java تستخدم "التمرير حسب القيمة" عند تمرير المعلمات إلى إحدى الطرق. ولذلك، لن يعمل تبديل الكائنات كما توقعت باستخدام هذه الطريقة. المثال التالي سيوضح ذلك.public class ObjectSwapper {
public static void main(String[] args) {
InnerClass obj1 = new InnerClass(12345);
InnerClass obj2 = new InnerClass(11111);
swap(obj1, obj2);
System.out.println("Obj1 ID value : " + obj1.id + "\n" + "Obj2 ID value : " + obj2.id);
}
static void swap(InnerClass x, InnerClass y) {
InnerClass temp;
temp = x;
x = y;
y = temp;
}
static class InnerClass {
public int id;
public InnerClass(int Id) {
this.id = Id;
}
}
}
الإخراج: لم يكن هناك مبادلة! عندما نستدعي طريقة المبادلة ونمرر الكائنات، فإننا نمرر نسخة من الكائن، مع جميع قيم الخاصية. هذا هو السبب في أنه يطلق عليه "التمرير حسب القيمة". تقوم طريقة المبادلة فعليًا بتبديل الكائنات التي تؤثر فقط على نسخة الكائن الأصلي. لذلك يتم الاحتفاظ بالأشياء الأصلية دون تغيير. سيكون الحل لهذا هو استخدام فئة مجمعة لتغليف الكائنين.
مبادلة الكائنات مع فئة المجمع
public class ObjectSwapper {
public static void main(String[] args) {
InnerClass obj1 = new InnerClass(12345);
InnerClass obj2 = new InnerClass(11111);
objectWrapper wrapperObj1 = new objectWrapper(obj1);
objectWrapper wrapperObj2 = new objectWrapper(obj2);
// Values before swapping
System.out.println("WrapperObj1 InncerClass ID value : " + wrapperObj1.innerObject.id + "\n" + "WrapperObj2 InncerClass ID value : "
+ wrapperObj2.innerObject.id + "\n");
swap(wrapperObj1, wrapperObj2);
// Values after swapping
System.out.println("WrapperObj1 InncerClass ID value : " + wrapperObj1.innerObject.id + "\n" + "WrapperObj2 InncerClass ID value : "
+ wrapperObj2.innerObject.id);
}
static void swap(objectWrapper wrapperObj1, objectWrapper wrapperObj2) {
InnerClass temp;
temp = wrapperObj1.innerObject;
wrapperObj1.innerObject = wrapperObj2.innerObject;
wrapperObj2.innerObject = temp;
}
static class InnerClass {
public int id;
public InnerClass(int Id) {
id = Id;
}
}
static class objectWrapper {
InnerClass innerObject;
public objectWrapper(InnerClass objInnner) {
this.innerObject = objInnner;
}
}
}
استخدمنا هنا فئة مجمعة تحتوي على خاصية نوع الكائنات التي نحتاج إلى تبديلها. باستخدام أسلوب مبادلة بسيط، فإنه يقوم بتبديل محتوى كائنات InnerClass الخاصة بكائنات فئة المجمّع. لأي تنفيذ إضافي لكائنات InnerClass التي تم تبديلها، يمكننا استخدام WrapperObj1.xyz وwrapperObj2.xyz وفقًا لذلك. الإخراج:
طريقة المبادلة () المضمنة في Java
تحتوي فئات Java Collections Framework على طريقة مدمجة لتبديل العناصر تسمى المبادلة() . java.util عبارة عن فئة أداة مساعدة تحتوي على طرق ثابتة يمكنها العمل على عناصر مثل القوائم من واجهة المجموعة . يعد استخدام طريقة المبادلة أسهل بكثير من المثال الذي ناقشناه سابقًا. طريقة المبادلة () هي طريقة ثابتة وبالتالي يمكنك استدعاؤها باستخدام اسم الفئة كـ Collections.swap() . نوع الإرجاع لطريقة المبادلة () باطل لذا لن يُرجع أي شيء. تحتاج إلى تمرير ثلاث وسائط إلى طريقة المبادلة () . تحقق من الملاحظة أدناه.swap(List<?> list, int a, int b)
حدود:
- القائمة - تحتوي القائمة على العناصر التي نقوم بتبديلها.
- أ — فهرس العنصر المراد تبديله .
- ب — فهرس عنصر آخر ليتم تبديله .
طريقة المبادلة () على ArrayList
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListSwapper {
public static void main(String[] args) {
try {
List fruits = new ArrayList();
fruits.add("Mango");
fruits.add("Papaya");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Watermelon");
fruits.add("Bael");
System.out.println("Before swapping : " + fruits);
//using Collection.swap() method
Collections.swap(fruits, 2, 5);
System.out.println("After swapping : " + fruits);
} catch (IndexOutOfBoundsException e) {
System.out.println("Index Out of Bound Exception thrown : " + e);
}
}
}
تحتوي قائمة ArrayList للفواكه على ستة عناصر. نقوم بتبديل العنصرين الثاني والخامس باستخدام طريقة الدالة Swap() . أفضل الممارسات هي كتابة طريقة المبادلة () داخل كتلة محاولة الالتقاط حيث يمكنها طرح IndexOutOfBoundsException في وقت التشغيل. الإخراج: إذا مررنا '2' و'8' كفهارس، فسيطرح التطبيق استثناءً لأن حجم القائمة هو ستة.
Collections.swap(fruits, 2, 8);
سيكون الإخراج:
GO TO FULL VERSION