Java kengaytirilgan saralash


ULASHISH

Java kengaytirilgan saralash

Java List’ni saralash bobida ro‘yxatlarni alifbo va son bo‘yicha saralashni o‘rgandingiz, lekin ro‘yxatda obyektlar bo‘lsa-chi?

Obyektlarni saralash uchun ularni qanday saralash kerakligini belgilovchi qoidani ko‘rsatishingiz kerak. Masalan, sizda avtomobillar ro‘yxati bo‘lsa, ularni yili bo‘yicha saralashni xohlashingiz mumkin; bunda qoida yili oldinroq bo‘lgan avtomobillar birinchi turishidan iborat bo‘lishi mumkin.

Comparator va Comparable interfeyslari obyektlarni saralashda qaysi qoida ishlatilishini belgilash imkonini beradi.

Saralash qoidasini belgilay olish stringlar va sonlar qanday saralanishini o‘zgartirishga ham imkon beradi.


Komparatorlar

Comparator interfeysini amalga oshiruvchi obyekt komparator (comparator) deb ataladi.

Comparator interfeysi ikki obyektni solishtirib, ro‘yxatda qaysi biri birinchi turishi kerakligini aniqlaydigan compare() metodiga ega sinf yaratish imkonini beradi.

compare() metodi quyidagicha son qaytarishi kerak:

  • Agar ro‘yxatda birinchi obyekt oldin turishi kerak bo‘lsa — manfiy.
  • Agar ro‘yxatda ikkinchi obyekt oldin turishi kerak bo‘lsa — musbat.
  • Agar tartib ahamiyatsiz bo‘lsa — nol.

Comparator interfeysini amalga oshiruvchi sinf taxminan quyidagicha ko‘rinishi mumkin:

// Sort Car objects by year
class SortByYear implements Comparator {
  public int compare(Object obj1, Object obj2) {
    // Make sure that the objects are Car objects
    Car a = (Car) obj1;
    Car b = (Car) obj2;
    
    // Compare the objects
    if (a.year < b.year) return -1; // The first car has a smaller year
    if (a.year > b.year) return 1;  // The first car has a larger year
    return 0; // Both cars have the same year
  }
}

Komparatordan foydalanish uchun uni saralash metodiga argument sifatida uzating:

// Use a comparator to sort the cars
Comparator myComparator = new SortByYear();
Collections.sort(myCars, myComparator);

Quyida avtomobillar ro‘yxatini yili bo‘yicha saralash uchun komparatordan foydalanilgan to‘liq misol keltirilgan:

Misol

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// Define a Car class
class Car {
  public String brand;
  public String model;
  public int year;
  
  public Car(String b, String m, int y) {
    brand = b;
    model = m;
    year = y;
  }
}

// Create a comparator
class SortByYear implements Comparator {
  public int compare(Object obj1, Object obj2) {
    // Make sure that the objects are Car objects
    Car a = (Car) obj1;
    Car b = (Car) obj2;
    
    // Compare the year of both objects
    if (a.year < b.year) return -1; // The first car has a smaller year
    if (a.year > b.year) return 1;  // The first car has a larger year
    return 0; // Both cars have the same year
  }
}

public class Main { 
  public static void main(String[] args) { 
    // Create a list of cars
    ArrayList<Car> myCars = new ArrayList<Car>();    
    myCars.add(new Car("BMW", "X5", 1999));
    myCars.add(new Car("Honda", "Accord", 2006));
    myCars.add(new Car("Ford", "Mustang", 1970));

    // Use a comparator to sort the cars
    Comparator myComparator = new SortByYear();
    Collections.sort(myCars, myComparator);

    // Display the cars
    for (Car c : myCars) {
      System.out.println(c.brand + " " + c.model + " " + c.year);
    }
  } 
}
O‘zingiz sinab ko‘ring »

Lambda ifodasidan foydalanish

Kodni qisqartirish uchun komparatorni compare() metodi bilan bir xil argumentlar va qaytariladigan qiymatga ega lambda ifodasi bilan almashtirish mumkin:

Misol

Komparator sifatida lambda ifodasidan foydalaning:

Collections.sort(myCars, (obj1, obj2) -> {
  Car a = (Car) obj1;
  Car b = (Car) obj2;
  if (a.year < b.year) return -1;
  if (a.year > b.year) return 1;
  return 0;
});
O‘zingiz sinab ko‘ring »

Maxsus saralash qoidalari

Komparatorlar yordamida stringlar va sonlar uchun maxsus saralash qoidalarini ham yaratish mumkin. Ushbu misolda barcha juft sonlarni toq sonlardan oldin joylashtirish uchun komparatordan foydalanamiz:

Misol

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class SortEvenFirst implements Comparator {
  public int compare(Object obj1, Object obj2) {
    // Make sure the objects are integers
    Integer a = (Integer)obj1;
    Integer b = (Integer)obj2;
    
    // Check each number to see if it is even
    // A number is even if the remainder when dividing by 2 is 0
    boolean aIsEven = (a % 2) == 0;
    boolean bIsEven = (b % 2) == 0;
    
    if (aIsEven == bIsEven) {
    
      // If both numbers are even or both are odd then use normal sorting rules
      if (a < b) return -1;
      if (a > b) return 1;
      return 0;
      
    } else {
    
      // If a is even then it goes first, otherwise b goes first
      if (aIsEven) {
      	return -1;
      } else {
        return 1;
      }
    }
  }
}

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    myNumbers.add(33);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(34);
    myNumbers.add(8);
    myNumbers.add(12);

    Comparator myComparator = new SortEvenFirst();
    Collections.sort(myNumbers, myComparator);

    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}
O‘zingiz sinab ko‘ring »


Comparable interfeysi

Comparable interfeysi obyektga compareTo() metodi orqali o‘zining saralash qoidasini belgilash imkonini beradi.

compareTo() metodi argument sifatida obyekt qabul qiladi va ro‘yxatda qaysi biri birinchi turishi kerakligini aniqlash uchun comparable obyektni argument bilan solishtiradi.

Komparatordagi kabi compareTo() metodi ham quyidagicha son qaytaradi:

  • Agar ro‘yxatda comparable obyekt oldin turishi kerak bo‘lsa — manfiy.
  • Agar ro‘yxatda boshqa obyekt oldin turishi kerak bo‘lsa — musbat.
  • Agar tartib ahamiyatsiz bo‘lsa — nol.

Java tilining ko‘plab o‘rnatilgan sinflari, masalan, String va Integer, Comparable interfeysini amalga oshiradi.

Shuning uchun stringlar va sonlarni saralash uchun komparator kerak emas.

Comparable interfeysini amalga oshiruvchi obyekt taxminan quyidagicha ko‘rinishi mumkin:

class Car implements Comparable {
  public String brand;
  public String model;
  public int year;
  
  // Decide how this object compares to other objects
  public int compareTo(Object obj) {
  	Car other = (Car)obj;
    if(year < other.year) return -1; // This object is smaller than the other one
    if(year > other.year) return 1;  // This object is larger than the other one
    return 0; // Both objects are the same
  }
}

Quyida avvalgi misolning o‘zi keltirilgan, lekin unda komparator o‘rniga Comparable interfeysidan foydalanilgan:

Misol

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// Define a Car class which is comparable
class Car implements Comparable {
  public String brand;
  public String model;
  public int year;
  
  public Car(String b, String m, int y) {
    brand = b;
    model = m;
    year = y;
  }
  
  // Decide how this object compares to other objects
  public int compareTo(Object obj) {
  	Car other = (Car)obj;
    if(year < other.year) return -1; // This object is smaller than the other one
    if(year > other.year) return 1;  // This object is larger than the other one
    return 0; // Both objects are the same
  }
}

public class Main { 
  public static void main(String[] args) { 
    // Create a list of cars
    ArrayList<Car> myCars = new ArrayList<Car>();    
    myCars.add(new Car("BMW", "X5", 1999));
    myCars.add(new Car("Honda", "Accord", 2006));
    myCars.add(new Car("Ford", "Mustang", 1970));

    // Sort the cars
    Collections.sort(myCars);

    // Display the cars
    for (Car c : myCars) {
      System.out.println(c.brand + " " + c.model + " " + c.year);
    }
  } 
}
O‘zingiz sinab ko‘ring »

Keng qo‘llaniladigan saralash usuli

Ikki sonni tabiiy tartibda saralashning eng oddiy usuli quyidagicha yozishdir:

if(a.year < b.year) return -1; // a is less than b
if(a.year > b.year) return 1; // a is greater than b
return 0; // a is equal to b

Lekin aslida buni atigi bitta qator bilan bajarish mumkin:

return a.year - b.year;

Bu usul yordamida elementlarni teskari tartibda ham osongina saralash mumkin:

return b.year - a.year;

Comparator va Comparable

Komparator — ikki xil obyektni solishtirish uchun ishlatiladigan bitta metodli obyekt.

Comparable — o‘zini boshqa obyektlar bilan solishtira oladigan obyekt.

Imkon bo‘lsa, Comparable interfeysidan foydalanish osonroq, lekin Comparator interfeysi kuchliroq, chunki u har qanday turdagi obyektni, hatto uning kodini o‘zgartira olmasangiz ham, saralash imkonini beradi.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!