JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ موازنہ ڪندڙ

جاوا ۾ موازنہ ڪندڙ

گروپ ۾ شايع ٿيل
سلام! اڄ اسان شين جي مقابلي بابت ڳالهائينداسين. ها... پر لڳي ٿو ته اسان اڳ ۾ ئي هن بابت هڪ کان وڌيڪ ڀيرا ڳالهايو آهي؟ :/ اسان ڄاڻون ٿا ته " ==" آپريٽر ڪيئن ڪم ڪندو آهي، انهي سان گڏ equals()۽ طريقا hashCode(). مقابلي واقعي جي باري ۾ نه آهي. اڳي، اسان جو مطلب وڌيڪ "برابري لاءِ شيون جاچڻ" وانگر هو. جاوا ۾ موازنہ ڪندڙ - 1پر هڪ ٻئي سان شين جي مقابلي ۾ مڪمل طور تي مختلف مقصد هوندا! سڀ کان وڌيڪ واضح آهي ترتيب ڏيڻ. ArrayList<>منهنجو خيال آهي ته جيڪڏهن توهان کي ٻڌايو ويو آهي ته انگن يا تارن جي فهرست ترتيب ڏيو ، توهان ان کي بغير ڪنهن مسئلن جي سنڀال ڪري سگهو ٿا:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       String name1 = "Masha";
       String name2 = "Sasha";
       String name3 = "Даша";

       List<String> names = new ArrayList<>();
       names.add(name1);
       names.add(name2);
       names.add(name3);

       Collections.sort(names);
       System.out.println(names);
   }
}
ڪنسول آئوٽ:

[Даша, Маша, Саша]
اهو تمام سٺو آهي جيڪڏهن توهان ڪلاس Collections۽ ان جو طريقو ياد ڪيو sort(). مان نه ٿو سمجهان ته نمبرن سان به ڪو مسئلو هوندو. هتي توهان لاء هڪ وڌيڪ ڏکيو ڪم آهي:
public class Car {

   private int manufactureYear;
   private String model;
   private int maxSpeed;

   public Car(int manufactureYear, String model, int maxSpeed) {
       this.manufactureYear = manufactureYear;
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   //...геттеры, сеттеры, toString()

}

import java.util.ArrayList;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       List<Car> cars = new ArrayList<>();

       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);

       cars.add(ferrari);
       cars.add(bugatti);
       cars.add(lambo);
   }
}
اهو تمام سادو آهي: هڪ ڪلاس Car۽ ان جا 3 شيون. فهرست ۾ ڪارن کي ترتيب ڏيڻ لاء ايترو مهربان ٿيو! توهان شايد پڇندا: "انهن کي ڪيئن ترتيب ڏيڻ گهرجي؟" نالي سان، پيداوار جي سال طرفان، وڌ ۾ وڌ رفتار سان؟ عظيم سوال. اسان هن وقت نٿا ڄاڻون ته ڪلاس جي شين کي ڪيئن ترتيب ڏيو Car. ۽، بلڪل قدرتي طور، جاوا اهو نه ڄاڻندو آهي يا نه! جڏهن اسان Collections.sort()شين جي لسٽ کي طريقي سان منتقل ڪرڻ جي ڪوشش ڪندا آهيون Car، اسان کي هڪ غلطي ملندي:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       List<Car> cars = new ArrayList<>();

       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);

       cars.add(ferrari);
       cars.add(bugatti);
       cars.add(lambo);

       //ошибка компилятора!
       Collections.sort(cars);
   }
}
۽ حقيقت ۾، ٻولي ڪيئن ڄاڻي ٿي ته اهي شيون ڪيئن ترتيب ڏيو جيڪي توهان لکندا آهيو؟ اهو توهان جي پروگرام جي مقصدن تي منحصر آهي. اسان کي ڪنهن به طرح جاوا کي سيکارڻو پوندو انهن شين جو مقابلو ڪرڻ. ۽ مقابلي جو طريقو اسان کي ضرورت آهي. هن مقصد لاء، جاوا هڪ خاص اوزار آهي - انٽرفيس Comparable. انگريزيءَ ۾ ان جو ترجمو ڪيو ويندو آهي “comparable”. Carاسان جي شين جي هڪ ٻئي سان مقابلي ڪرڻ ۽ ڪنهن به طرح ترتيب ڏيڻ لاءِ ، ڪلاس کي لازمي طور هن انٽرفيس کي لاڳو ڪرڻ گهرجي ۽ ان جو واحد طريقو لاڳو ڪرڻ گهرجي: compareTo():
public class Car implements Comparable<Car> {

   private int manufactureYear;
   private String model;
   private int maxSpeed;

   public Car(int manufactureYear, String model, int maxSpeed) {
       this.manufactureYear = manufactureYear;
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   @Override
   public int compareTo(Car o) {
       return 0;
   }

   //...геттеры, сеттеры, toString()

}
توجهه ڏيو:اسان انٽرفيس جي وضاحت ڪئي Comparable<Car>، نه صرف Comparable. هي هڪ ٽائيپ ٿيل انٽرفيس آهي، اهو آهي، ان کي مخصوص طبقي جي وضاحت ڪرڻ جي ضرورت آهي جنهن سان اهو لاڳاپيل آهي. اصول ۾، <Car>توهان ان کي انٽرفيس مان هٽائي سگهو ٿا، پر پوء اهو ڊفالٽ جي شين جي مقابلي ۾ Object. اسان جي ڪلاس ۾ هڪ طريقي جي بدران compareTo(Car o)اسان وٽ هوندو:
@Override
   public int compareTo(Object o) {
       return 0;
   }
يقينن، اهو اسان لاءِ ڪم ڪرڻ تمام آسان آهي Car. طريقي جي اندر compareTo()اسان مشينن جي مقابلي لاءِ منطق لاڳو ڪريون ٿا. اچو ته اسان کي انهن کي ترتيب ڏيڻ جي ضرورت آهي پيداوار جي سال طرفان. توهان شايد محسوس ڪيو آهي ته اهو طريقو compareTo()قدر موٽائي ٿو int، نه boolean. اهو توهان کي حيران ٿيڻ نه ڏيو. حقيقت اها آهي ته ٻن شين جو مقابلو اسان کي 3 ممڪن اختيار ڏئي ٿو:
  • а < b
  • a > b
  • a == b.
ان boolean۾ صرف 2 قدر آهن - صحيح ۽ غلط، جيڪو شين جي مقابلي ۾ مشڪل آهي. هر شي تمام گهڻو آسان آهي int. جيڪڏهن واپسي جي قيمت > 0آهي، پوء a > b. جيڪڏهن نتيجو compareTo < 0آهي، پوء а < b. خير، جيڪڏهن نتيجو آهي == 0، ته ٻه شيون برابر آهن: a == b. اسان جي ڪلاس کي ڪارن کي ترتيب ڏيڻ لاءِ تيار ڪرڻ جو سال سيکارڻ ايترو ئي آسان آهي جيترو شيلنگ ناشپاتيءَ کي:
@Override
public int compareTo(Car o) {
   return this.getManufactureYear() - o.getManufactureYear();
}
هتي ڇا ٿي رهيو آهي؟ اسان هڪ ڪار شئي ( this) وٺون ٿا، هن ڪار جي ٺهڻ جو سال، ۽ ان مان ٻي ڪار جي ٺهڻ جو سال (جنهن سان اسان اعتراض جو مقابلو ڪريون ٿا). جيڪڏهن پهرين ڪار جي پيداوار جو سال وڏو آهي، اهو طريقو واپس ٿيندو int > 0. جنهن جو مطلب آهي ڪار this >هڪ ڪار آهي о. جيڪڏهن، ان جي ابتڙ، ٻئي ڪار جي پيداوار جو سال ( о) وڏو آهي، پوء اهو طريقو هڪ منفي نمبر واپس ڪندو، ۽ تنهن ڪري о > this. خير، جيڪڏھن اھي برابر آھن، طريقو واپس ٿيندو 0. شين جي مجموعن کي ترتيب ڏيڻ لاءِ اهڙو سادو ميکانيزم اڳ ۾ ئي ڪافي آهي Car! توهان کي ٻيو ڪجهه ڪرڻ جي ضرورت ناهي. هي وٺو:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       List<Car> cars = new ArrayList<>();

       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);

       cars.add(ferrari);
       cars.add(bugatti);
       cars.add(lambo);

       //тут раньше была ошибка
       Collections.sort(cars);
       System.out.println(cars);
   }
}
ڪنسول آئوٽ:

[Car{manufactureYear=1990, model='Ferrari 360 Spider', maxSpeed=310}, 
Car{manufactureYear=2010, model='Bugatti Veyron', maxSpeed=350}, 
Car{manufactureYear=2012, model='Lamborghini Gallardo', maxSpeed=290}]
ڪارون ترتيب ڏنل آهن جيئن اهي هجڻ گهرجن! :) جاوا ۾ موازنہ ڪندڙ - 2ڪهڙين حالتن ۾ ان کي استعمال ڪرڻ گهرجي Comparable؟ مقابلي جو طريقو لاڳو ڪيو ويو آهي Comparable"قدرتي ترتيب" سڏيو ويندو آهي. اهو ئي سبب آهي ته طريقي ۾ compareTo()توهان سڀ کان وڌيڪ عام مقابلي جو طريقو بيان ڪيو آهي جيڪو توهان جي پروگرام ۾ هن طبقي جي شين لاء استعمال ڪيو ويندو. قدرتي ترتيب اڳ ۾ ئي جاوا ۾ موجود آهي. مثال طور، جاوا ڄاڻي ٿو ته اسٽرنگ اڪثر ڪري الفابيٽ سان ترتيب ڏنل آهن، ۽ انگ اڪثر ڪري ترتيب ڏنل قيمت جي ترتيب سان ترتيب ڏنل آهن. تنهن ڪري، جيڪڏهن توهان طريقي کي نمبرن يا اسٽرنگ جي فهرست تي سڏين ٿا sort()، انهن کي ترتيب ڏنو ويندو. جيڪڏهن اسان جي پروگرام ۾ ڪارٽون اڪثر ڪيسن ۾ مقابلي ۽ ترتيب سان ترتيب ڏني وينديون پيداوار جي سال جي لحاظ کان، پوء اهو انٽرفيس Comparable<Car>۽ طريقو استعمال ڪندي انهن لاء قدرتي ترتيب جي وضاحت ڪرڻ جي قابل آهي compareTo(). پر ڇا جيڪڏهن اهو اسان لاء ڪافي ناهي؟ اچو ته تصور ڪريو ته اسان جو پروگرام ايترو سادو ناهي. اڪثر ڪيسن ۾، ڪارن جي قدرتي ترتيب (اسان ان کي ٺاھڻ جي سال جي بنياد تي مقرر ڪيو) اسان کي مناسب آهي. پر ڪڏهن ڪڏهن اسان جي گراهڪن جي وچ ۾ تيز ڊرائيونگ جا مداح آهن. جيڪڏهن اسان انهن مان چونڊڻ لاءِ ڪارن جي فهرست تيار ڪري رهيا آهيون، انهن کي وڌ ۾ وڌ رفتار سان ترتيب ڏيڻ جي ضرورت آهي. جاوا ۾ موازنہ ڪندڙ - 3مثال طور، اسان کي 15٪ ڪيسن ۾ اهڙي ترتيب جي ضرورت آهي. اهو واضح طور تي Carتيار ڪرڻ جي سال جي بدران رفتار جي لحاظ سان قدرتي ترتيب ڏيڻ لاء ڪافي ناهي. پر اسان 15 سيڪڙو گراهڪن کي نظرانداز نٿا ڪري سگھون. اسان ڇا ڪريون؟ هتي هڪ ٻيو انٽرفيس اسان جي مدد لاءِ اچي ٿو - Comparator. جيئن ته، Comparableاهو ٽائيپ ڪيو ويو آهي. ڪهڙو فرق آهي؟ Comparableاسان جي شين کي ”مقابلي“ بڻائي ٿو ۽ انهن لاءِ سڀ کان وڌيڪ قدرتي ترتيب ٺاهي ٿو جيڪو اڪثر ڪيسن ۾ استعمال ٿيندو. Comparator- هي هڪ الڳ "مقابلي ڪندڙ" طبقو آهي (ترجمو ٿورڙو بيڪار، پر سمجھڻ وارو آهي). Carجيڪڏهن اسان کي ڪجهه مخصوص ترتيب ڏيڻ جي ضرورت آهي، اسان کي ڪلاس ۾ وڃڻ ۽ منطق کي تبديل ڪرڻ جي ضرورت ناهي compareTo(). ان جي بدران، اسان پنهنجي پروگرام ۾ هڪ الڳ موازنہ ڪلاس ٺاهي سگهون ٿا ۽ ان کي سيکاري سگهون ٿا ته اسان کي گهربل ترتيب ڏيو!
import java.util.Comparator;

public class MaxSpeedCarComparator implements Comparator<Car> {

   @Override
   public int compare(Car o1, Car o2) {
       return o1.getMaxSpeed() - o2.getMaxSpeed();
   }
}
جئين توهان ڏسي سگهو ٿا، اسان جو طريقو Comparatorبلڪل سادو آهي. صرف ھڪڙو طريقو آھي compare()- اھو ھڪڙو انٽرفيس طريقو آھي Comparator، جنھن تي عمل ڪيو وڃي. اهو ٻن شين کي انپٽ طور وٺندو آهي Car۽ انهن جي وڌ ۾ وڌ رفتار کي معمولي طريقي سان (ذاتي ڪرڻ سان) جي ڀيٽ ڪري ٿو. جهڙوڪ compareTo()، اهو نمبر واپس ڪري ٿو int، مقابلي جو اصول ساڳيو آهي. اسان اهو ڪيئن استعمال ڪري سگهون ٿا؟ بلڪل سادو:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Main {

   public static void main(String[] args) {

       List<Car> cars = new ArrayList<>();

       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);

       cars.add(ferrari);
       cars.add(bugatti);
       cars.add(lambo);

       Comparator speedComparator = new MaxSpeedCarComparator();
       Collections.sort(cars, speedComparator);

       System.out.println(cars);
   }
}
ڪنسول آئوٽ:

[Car{manufactureYear=2012, model='Lamborghini Gallardo', maxSpeed=290}, 
Car{manufactureYear=1990, model='Ferrari 360 Spider', maxSpeed=310}, 
Car{manufactureYear=2010, model='Bugatti Veyron', maxSpeed=350}]
Collections.sort()اسان صرف هڪ comparator اعتراض ٺاهي ۽ ان کي ترتيب ڏيڻ واري لسٽ سان گڏ طريقي سان منتقل ڪيو . ان پٽ جي طور تي هڪ موازنہ حاصل ڪرڻ کان پوء، طريقو sort()استعمال نه ڪندو قدرتي ترتيب واري ترتيب کي compareTo()ڪلاس جي طريقي ۾ بيان ڪيو ويو آهي Car. ان جي بدران، اهو لاڳو ڪندو ترتيب ڏيڻ وارو الگورتھم ان کي منظور ڪيل مقابلي کان. هي اسان کي ڪهڙو فائدو ڏئي ٿو؟ پهرين، لکيل ڪوڊ سان مطابقت. اسان ھڪڙو نئون، مخصوص ترتيب ڏيڻ وارو طريقو ٺاھيو آھي، موجوده ھڪڙي کي برقرار رکندي، جيڪو اڪثر ڪيسن ۾ استعمال ٿيندو. اسان ڪلاس کي بلڪل به هٿ نه ڪيو Car. هو Comparableائين ئي رهيو جيئن هو:
public class Car implements Comparable<Car> {

   private int manufactureYear;
   private String model;
   private int maxSpeed;

   public Car(int manufactureYear, String model, int maxSpeed) {
       this.manufactureYear = manufactureYear;
       this.model = model;
       this.maxSpeed = maxSpeed;
   }

   @Override
   public int compareTo(Car o) {
       return this.getManufactureYear() - o.getManufactureYear();
   }

   //...геттеры, сеттеры, toString()

}
ٻيو، لچڪدار. اسان ڪيتريون ئي قسمون شامل ڪري سگھون ٿا جيئن اسان چاهيون ٿا. چئو، ڪارن کي ترتيب ڏيو رنگ، رفتار، وزن، يا ڪيترا ڀيرا ڪار بيٽمن فلمن ۾ استعمال ڪيو ويو. اهو صرف هڪ اضافي ٺاهڻ لاء ڪافي آهي Comparator. اهو ئي سڀ ڪجهه آهي! اڄ توهان ٻه اهم ميکانيزم سکيا آهن جيڪي توهان اڪثر ڪم تي حقيقي منصوبن ۾ استعمال ڪندا. پر، جيئن توهان ڄاڻو ٿا، نظريو بغير عمل جي ڪا به شيء ناهي. تنهن ڪري، اهو توهان جي علم کي مضبوط ڪرڻ ۽ ڪيترن ئي مسئلن کي حل ڪرڻ جو وقت آهي! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION