CodeGym /Java Blog /এলোমেলো /জাভা সংগ্রহ বাছাই()
John Squirrels
লেভেল 41
San Francisco

জাভা সংগ্রহ বাছাই()

এলোমেলো দলে প্রকাশিত
ডেভেলপারদের ডেটা নিয়ে কাজ করার জন্য আমাদের সবচেয়ে সাধারণ ফাংশনগুলির মধ্যে একটি হল বাছাই করা--আমাদের ডেটা বাছাই করতে সক্ষম হওয়ার মাধ্যমে, আমরা আমাদের অ্যালগরিদমগুলিকে আরও দ্রুত চালানোর জন্য অপ্টিমাইজ করতে পারি এবং সময়ের একটি ভগ্নাংশে এটির প্রয়োজনীয় ডেটা খুঁজে পেতে পারি অন্যথায় নিতে হবে। আজকের পাঠে, আমরা জাভা কালেকশন সর্ট() সম্পর্কে কথা বলব। একটি দ্রুত চিন্তা পরীক্ষা হিসাবে: কল্পনা করুন যে আপনি একটি বিশ্ববিদ্যালয়ের তালিকার মাধ্যমে একটি নাম অনুসন্ধান করছেন। এই স্কুলে হাজার হাজার ছাত্র থাকতে পারে। যদি আপনাকে দেওয়া রোস্টারটি বর্ণানুক্রমিক ক্রমে না থাকে, তাহলে আপনাকে প্রতিটি একক পৃষ্ঠা ফ্লিপ করতে হবে এবং আপনি যে নামটি খুঁজছেন সেটি না পাওয়া পর্যন্ত আপনি কোথাও একটি নাম এড়িয়ে যাননি তা নিশ্চিত করতে খুব সাবধানে দেখতে হবে। অন্যদিকে, যদি রোস্টারটি বর্ণানুক্রমিক হয়, তবে আপনাকে আপনার অনুসন্ধানে কম কঠোর হতে হবে না, কিন্তু আপনি একই প্রথম অক্ষর সহ রোস্টারের বিভাগে সহজেই ঝাঁপ দিতে পারেন, এবং আপনি যাকে খুঁজছিলেন তার কাছে না পৌঁছানো পর্যন্ত আপনি বড় লাফ দিয়ে পৃষ্ঠাগুলির চারপাশে লাফিয়ে যেতে পারেন। আপনি যত বেশি ডেটা নিয়ে কাজ করছেন, তত বেশি গুরুত্বপূর্ণ যে আপনি এটি যতটা সম্ভব কার্যকরী এবং দক্ষতার সাথে ব্যবহার করছেন। এই নিবন্ধে, আমরা সংগ্রহের সাজানোর পদ্ধতি ব্যবহার করে জাভাতে (অ্যারেলিস্ট সহ) যে কোনও তালিকা বাস্তবায়ন কীভাবে সাজানো যায় তা নিয়ে আলোচনা করব।

জাভা সংগ্রহ সাজানোর পদ্ধতি ব্যবহার করে জাভাতে একটি অ্যারেলিস্ট কীভাবে সাজানো যায়

জাভা Collections.sort পদ্ধতি সম্পর্কে কথা বলা যাক। java.util প্যাকেজটিতে অনেক দরকারী ইউটিলিটি এবং প্যাকেজ রয়েছে যা প্রায়শই অ্যারেলিস্ট সহ ডেভেলপারদের দ্বারা ব্যবহৃত হয়। ধরুন আপনার নিম্নলিখিত সহজ প্রোগ্রাম আছে:

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
আপনি রঙ তালিকা মুদ্রণ করতে সক্ষম হতে চান, কিন্তু বর্ণানুক্রমিক ক্রমে. কিভাবে আপনি এটা করতে পারে? java.util.Collections ব্যবহার করে, বাছাই করা ওয়ান-লাইনারের মতোই সহজ:

Collections.sort(colors);
তা-দা! আপনার রঙের তালিকা এখন জায়গায় সাজানো হয়েছে। আপনি যদি তালিকাটি মুদ্রণ করতে চান, যেমন:

System.out.println(colors);
তারপর আপনি নিম্নলিখিত আউটপুট পাবেন:

[Blue, Green, Orange, Red]
এটা কত সহজ ছিল?! Collections.sort() ব্যবহার করা ঠিক ততটাই সহজ হবে যাতে পূর্ণসংখ্যা, ফ্লোট বা সেই বিষয়ে অন্য যেকোন সাধারণ ডেটা টাইপের তালিকা ক্রমবর্ধমান ক্রমে সাজানো যায়। কিন্তু আপনি যদি অবরোহ ক্রমে সাজাতে চান? অবশ্যই এমন কিছু ক্ষেত্রে আছে যেখানে এটি অর্থপূর্ণ হয়-- কল্পনা করুন যে আপনার কাছে একটি নির্দিষ্ট শ্রেণীর পরীক্ষার স্কোরের একটি তালিকা ছিল এবং আপনি খুঁজে বের করতে চেয়েছিলেন যে শীর্ষ-স্কোরকারী শিক্ষার্থী কারা। তালিকাটিকে নিচের ক্রমানুসারে বাছাই করা অনেক বেশি বোধগম্য হবে (প্রথমে সর্বোচ্চ স্কোর), যাতে আপনি যে উত্তরগুলি খুঁজছেন তা শীর্ষে থাকে। সৌভাগ্যক্রমে, Collections.sort() একটি ঐচ্ছিক ২য় প্যারামিটার দিয়ে ওভাররাইট করা হয়েছে, যা আপনাকে এই কাজটি করতে দেয়:

sort(List l, Comparator c)
কিন্তু একটি তুলনাকারী কি? ঠিক আছে, একটি তুলনাকারী কেবল একটি ফাংশন যা দুটি ইনপুট তুলনা করে এবং কোন ইনপুটটি প্রথমে আসে তা প্রতিনিধিত্ব করে একটি সংখ্যা প্রদান করে। আপনি যদি আদিম ডেটা প্রকারের একটি ArrayList বাছাই করেন, তাহলে জাভা সংগ্রহগুলি ইতিমধ্যেই আপনাকে একটি reverseOrder() তুলনাকারী প্রদান করে। এটি এই মত বলা যেতে পারে:

Collections.sort(colors, Collections.reverseOrder());
এখন, রঙগুলিকে জায়গায় বিপরীতভাবে সাজানো হয়েছে যাতে আপনি যদি এটি মুদ্রণ করেন তবে আপনি নিম্নলিখিত আউটপুট পাবেন:

[Red, Orange, Green, Blue]

জাভাতে নন-প্রিমিটিভ ডেটা টাইপ বাছাই করতে সংগ্রহগুলি কীভাবে ব্যবহার করবেন

এখন পর্যন্ত, আপনি দেখেছেন যে Collections.sort() পদ্ধতি ব্যবহার করে জাভাতে স্ট্রিং বা ints-এর ArrayLists সাজানো কোডের এক লাইনের মতোই সহজ। কিন্তু প্রায়ই, আপনার ArrayLists অ-আদিম তথ্য প্রকার সংরক্ষণ করা হবে. আপনি যখন আরও জটিল বৈশিষ্ট্যযুক্ত ডেটা নিয়ে কাজ করছেন, তখন আপনি এই বস্তুগুলিকে উপস্থাপন করার জন্য ক্লাস লিখতে চাইবেন এবং কীভাবে তাদের বৈশিষ্ট্যগুলি ব্যবহার করে একে অপরের সাথে তুলনা করা হবে। এর একটি উদাহরণ অন্বেষণ করতে, আসুন রঙের একটি তালিকা বাছাই করার উদাহরণটি আবার দেখি, তবে এবার, স্ট্রিংগুলিকে সাজানোর পরিবর্তে, আমরা রঙের বস্তুগুলিকে সাজানো হবে। আমাদের বেসিক কালার ক্লাস এইরকম দেখতে পারে:

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
Collections.sort() এর সাথে আমাদের কালার ক্লাস সামঞ্জস্যপূর্ণ করার জন্য, যাতে কালেকশনগুলি বুঝতে পারে কিভাবে রঙের বস্তুর তুলনা এবং সাজানো যায়, আমাদের দুটি ছোট পরিবর্তন করতে হবে:
  1. রঙকে তুলনামূলক বস্তু তৈরি করুন (তুলনাযোগ্য <অবজেক্ট> প্রয়োগগুলি যোগ করুন)
  2. ক্লাসে compareTo পদ্ধতিটি ওভাররাইড করুন (পাবলিক int compareTo(অবজেক্ট o) ওভাররাইড করুন)
এই পরিবর্তনগুলির সাথে, আমাদের ক্লাসটি এখন এইরকম দেখাচ্ছে:

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
লক্ষ্য করুন যে Color এর compareTo পদ্ধতিটি কেবল স্ট্রিং এর compareTo পদ্ধতিকে কল করে; বর্ণানুক্রমিকভাবে বাছাই করা হবে। আমরা যদি ঊর্ধ্ব ক্রম অনুসারে লাল মান অনুসারে সাজাতে চাই, উদাহরণস্বরূপ, আমরা রিটার্ন স্টেটমেন্টের পরিবর্তে this.r - cr; (যদি আমরা সবুজ মান অনুসারে সাজাতে চাই, তাহলে সেটা হবে cg - this.g;)। এখন আমরা যদি ডাকি

Collections.sort(colors);
শুধুমাত্র স্ট্রিংগুলির পরিবর্তে রঙের অ্যারেলিস্টে, এটি কাজ করবে কারণ সংগ্রহগুলি বোঝে কিভাবে রঙের বস্তুর তুলনা করতে হয়। আপনি যদি আপনার বস্তুটিকে তুলনাযোগ্য <অবজেক্ট> বাস্তবায়ন করতে না চান, তাহলে আপনি বিকল্পভাবে আপনার ক্লাসের জন্য একটি তুলনামূলক লিখতে পারেন এবং সেটিকে 2-প্যারামিটার Collections.sort() পদ্ধতিতে পাস করতে পারেন। একটি তুলনাকারী একটি সর্বজনীন int তুলনা (অবজেক্ট ওয়ান, অবজেক্ট টু) একটি পদ্ধতিকে ওভাররাইড করে এবং Collections.sort() পদ্ধতিটি সাজানোর সময় বস্তুর তুলনা করার জন্য এটি ব্যবহার করে। SortByName এবং SortByRed তুলনাকারীদের একটি উদাহরণ নীচে প্রয়োগ করা হয়েছে:

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
এটি দিয়ে, আপনি এখন কল করতে পারেন

Collections.sort(colors, new SortByName());
রঙ শ্রেণী আসলে তুলনামূলক বাস্তবায়ন ছাড়া, এবং এটি এখনও কাজ করবে। কখনও কখনও, আপনি ল্যাম্বডা ফাংশন ব্যবহার করে এটি ইন-লাইনে করা দেখতে পাবেন। একটি ল্যাম্বডা ফাংশন মূলত একটি নামহীন ফাংশন যা আপনি কোডের লাইনের মধ্যে সংজ্ঞায়িত করতে পারেন, যা এটিকে বলে। এগুলি দরকারী যখন আপনাকে শুধুমাত্র একটি নির্দিষ্ট উদাহরণের জন্য একটি ফাংশন কল করতে হবে এবং অন্য কোথাও সম্পূর্ণ আলাদা ফাংশন সংজ্ঞায়িত করতে চান না। SortByName তুলনাকারীকে একটি ল্যাম্বডা ফাংশন ব্যবহার করে ইন-লাইনে সংজ্ঞায়িত করা যেতে পারে, যেমন:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
আপনি অনুমান করতে পারেন, (a, b) ল্যাম্বডা ফাংশনগুলির পরামিতিগুলিকে প্রতিনিধিত্ব করে (যে দুটি বস্তুর তুলনা করা হবে)। -> বোঝায় যে নিম্নলিখিতটি একটি ল্যাম্বডা ফাংশন সংজ্ঞা। এটা সম্বন্ধে! আপনি এখন সংগ্রহ প্যাকেজ ব্যবহার করে জাভাতে ArrayLists সাজানোর সবচেয়ে জনপ্রিয় পদ্ধতি দেখেছেন।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION