Skip to content

Commit 49c8cb3

Browse files
Added list sorting technique in details
1 parent 85becb6 commit 49c8cb3

1 file changed

Lines changed: 257 additions & 1 deletion

File tree

11.md

Lines changed: 257 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ import java.util.LinkedList;
8282
import java.util.Vector;
8383
public class Main {
8484
public static void main(String[] args) {
85-
List list;
85+
List list, list2, list3;
8686
list = new ArrayList();
8787
list2 = new LinkedList();
8888
list3 = new Vector();
@@ -216,4 +216,260 @@ list.remove(new Integer(13));
216216
এরকম আরো বেশ কিছু মেথড এবং তাদের বিস্তর ব্যাখ্যা ওরাকলের অফিসিয়াল ডকুমেন্টেশন সাইটে পাওয়া যাবে । আগ্রহীরা সেখান থেকে দেখে নিতে পারেন । লিংকঃ http://docs.oracle.com/javase/8/docs/api/java/util/List.html
217217

218218

219+
**লিস্ট সর্ট করা(Sort a List)**
219220

221+
কোন একটি লিস্টকে সর্ট করার চেয়ে সহজ বিষয় আর কিছু হতেই পারেনা । তবে সমস্যা হল একটি লিস্টকে সর্ট করার নানাবিধ উপায় থাকায় আপনি কনফিউজ হয়ে যেতে পারেন যে আসলে কক্ষন কোন পদ্ধতিতে সর্ট করবেন । আমি নিজেও মাঝে মাঝে কনফিউজ হয়ে যাই । যাইহোক আমরা লিস্ট সর্টিং এর একেবারে বেসিক থেকে ধীরে ধীরে সামনের দিকে এগিয়ে যাব । বলে রাখা ভালো আমরা এখানে বেসিক্যালি ২ প্রকারের সর্টিং টেকনিক দেখবো এবং তাদের আবার ২ প্রকার সাব সর্টিং টেকনিক দেখবো । আগ্রহীরা আরো কিছুটা ঘাটাঘাটি করলে আরো অনেক কিছুই জানতে পারবে ।
222+
223+
পদ্ধতি ১ঃ
224+
225+
```java
226+
import java.util.ArrayList;
227+
import java.util.Collections;
228+
import java.util.List;
229+
public class Main {
230+
231+
public static void main(String[] args) {
232+
233+
List<Integer> list = new ArrayList<>();
234+
list.add(7);
235+
list.add(5);
236+
list.add(13);
237+
list.add(17);
238+
list.add(3);
239+
240+
Collections.sort(list);
241+
242+
list.forEach((x) -> {
243+
System.out.println(x);
244+
});
245+
}
246+
}
247+
```
248+
249+
এখানে আমরা `Collections` ক্লাসের একটি মেথড `sort` যেটি ইনপুট প্যারামিটার হিসাবে একটি লিস্ট অবজেক্ট নেয় এবং সেটিকে ইনপ্লেস সর্ট করে দেয় । অর্থাৎ এই মেথডের রিটার্ন টাইপ ভয়েড । এবং এটি অ্যাসেন্ডিং ( ছোট থেকে ক্রমান্বয়ে বড় ) অর্ডারে সর্ট করে ।
250+
251+
আমরা যদি ডিসেন্ডিং অর্ডারে সর্ট করতে চাই তবে আমাদের আরেকটু কাজ বেশি করতে হবে । আর সেটি হল `sort` নামক মেথডে আরেকটি প্যারামিটার পাস করতে হবে যেটি আসলে একটি `Comparator` অবজেক্ট । যেটার মাধ্যমে আমরা বলে দিব যে আসলে সর্টটি কোন অর্ডারে হবে বা কোন এলিমেন্টের সাপেক্ষে হবে । কোডটিকে সেক্ষেত্রে আমরা এভাবে লিখতে পারতাম,
252+
253+
```java
254+
import java.util.ArrayList;
255+
import java.util.Collections;
256+
import java.util.Comparator;
257+
import java.util.List;
258+
259+
public class Main {
260+
261+
public static void main(String[] args) {
262+
263+
List<Integer> list = new ArrayList<>();
264+
list.add(7);
265+
list.add(5);
266+
list.add(13);
267+
list.add(17);
268+
list.add(3);
269+
270+
Comparator<Integer> comparator = new Comparator<Integer>() {
271+
@Override
272+
public int compare(Integer t1, Integer t2) {
273+
return t2-t1;
274+
}
275+
};
276+
277+
Collections.sort(list, comparator);
278+
279+
list.forEach((x) -> {
280+
System.out.println(x);
281+
});
282+
}
283+
}
284+
```
285+
286+
উল্লেখ্য এখানে `Comparator` একটি ইন্টারফেস এবং এবং `compare` একটি `abstract` মেথড তাই আমাদের এটিকে ইমপ্লিমেন্ট করতে হয়েছে । ‍`compare` মেথডটি একটি ইন্টিজার নাম্বার রিটার্ন করে । দুটি অ্যাট্রিবিউটের মাঝে কম্পেয়ার করে পজেটিভ, নেগেটিভ বা শুন্য রিটার্ন করে । শুন্য রিটার্ন করা মানে দুটি সমান । পজেটিভ রিটার্ন করা মানে প্রথমটি বড় আর অন্যথায় ছোট ।
287+
আমরা আলাদা ভাবে `Comparator` এর অবজেক্ট ক্রিয়েট না করেও কাজটি করতে পারতাম ইনপ্লেসে । সেক্ষেত্রে এরকম হতে পারত,
288+
289+
```java
290+
Collections.sort(list, new Comparator<Integer>() {
291+
@Override
292+
public int compare(Integer t, Integer t1) {
293+
return t1-t;
294+
}
295+
});
296+
```
297+
298+
বর্তমান সময় যেহেতু ল্যামডা এক্সপ্রেশনের যুগ চলছে তাই এটিকে আরো সহজে এবং খুব সংক্ষেপে এভাবেও লেখা যেত,
299+
300+
```java
301+
Collections.sort(list, (Integer t1, Integer t2) -> t2-t1);
302+
```
303+
304+
কাজ বেসিক্যালি সব একই ভাবে করছে ।
305+
306+
307+
এতক্ষন আমরা দেখলাম প্রিমিটিভ টাইপের ডাটার একটি লিস্ট সর্ট করা । এমনতো হতেই পারে যে আপনার কাছে একটি কাষ্ট টাইপের অবজেক্ট কনটেইন করে এমন একটি লিস্ট সর্ট করতে হবে ওই অবজেক্টের নির্দিষ্ট কোন এক বা একাধিক প্রপার্টির সাপেক্ষে । সেক্ষেত্রে করনীয় কি সেটা এবার চলুন দেখে ফেলি ।
308+
309+
310+
```java
311+
import java.util.ArrayList;
312+
import java.util.Collections;
313+
import java.util.Comparator;
314+
import java.util.List;
315+
316+
class Employee {
317+
318+
int id;
319+
String name;
320+
int age;
321+
int salary;
322+
323+
public Employee(int id, String name, int age, int salary) {
324+
this.id = id;
325+
this.name = name;
326+
this.age = age;
327+
this.salary = salary;
328+
}
329+
}
330+
331+
public class Main {
332+
333+
public static void main(String[] args) {
334+
335+
List<Employee> list = new ArrayList<>();
336+
list.add(new Employee(1, "Abul", 27, 35000));
337+
list.add(new Employee(2, "Babul", 25, 37000));
338+
list.add(new Employee(3, "Kabul", 29, 30000));
339+
list.add(new Employee(4, "Mofiz", 24, 36000));
340+
list.add(new Employee(5, "Hafiz", 28, 34000));
341+
342+
Collections.sort(list, new Comparator<Employee>(){
343+
@Override
344+
public int compare(Employee t, Employee t1) {
345+
return t.age - t1.age;
346+
}
347+
});
348+
349+
list.forEach((x) -> {
350+
System.out.println(x.salary);
351+
});
352+
}
353+
}
354+
```
355+
356+
ঠিক আগের মতই কাজ করতে পারবেন । তবে এখানে অবজেক্ট নিয়ে কাজ করতে হবে । এবং অবজেক্টের কোন ফিল্ডের রেসপেক্টে সর্ট করতে চাচ্ছেন সেটাও ডিফাইন করে দিতে হবে । অ্যাসেন্ডিং বা ডিসেন্ডিং যেকোন ভাবেই সর্ট করতে পারবে । এমনকি একাধিক ফিল্ডের রেসপেক্টে যদি সর্ট করতে চান সেটাও করতে পারবে । আপনারা চাইলে ল্যামডা এক্সপ্রেশন ব্যাবহার করতে পারতেন সেক্ষেত্রে এরকম হতো কোডটি,
357+
358+
```java
359+
Collections.sort(list, (Employee t, Employee t1) -> t1.age – t.age);//descending order
360+
```
361+
362+
363+
এবার আমরা একটু ভিন্ন একটা পদ্ধতি দেখবো । যদি এমন হয় যে আমাদের এই ক্লাসটি প্রায়ই সর্ট করতে হয় এবং নির্দিষ্ট একটা অর্ডারে সর্ট করতে হয় , সেক্ষেত্রে আমরা একটা বিশেষ কাজ করতে পারি । আমরা `Comparable` ইন্টারফেসটি ইমপ্লিমেন্ট করতে পারি । `Comparable` ইন্টারফেসের মাঝে `compareTo` মেথডটি অভাররাইড করলেই কাজ শেষ । অ্যাসেন্ডিং বা ডিসেন্ডিং আগের মতই । তবে চলুন দেখি কিভাবে সেটি করা যায় সেটি দেখে ফেলি ।
364+
365+
366+
```java
367+
import java.util.ArrayList;
368+
import java.util.Collections;
369+
import java.util.List;
370+
371+
class Employee implements Comparable<Employee> {
372+
373+
int id;
374+
String name;
375+
int age;
376+
int salary;
377+
378+
public Employee(int id, String name, int age, int salary) {
379+
this.id = id;
380+
this.name = name;
381+
this.age = age;
382+
this.salary = salary;
383+
}
384+
385+
@Override
386+
public int compareTo(Employee t) {
387+
return this.age - t.age;
388+
}
389+
}
390+
391+
public class Main {
392+
393+
public static void main(String[] args) {
394+
395+
List<Employee> list = new ArrayList<>();
396+
list.add(new Employee(1, "Abul", 27, 35000));
397+
list.add(new Employee(2, "Babul", 25, 37000));
398+
list.add(new Employee(3, "Kabul", 29, 30000));
399+
list.add(new Employee(4, "Mofiz", 24, 36000));
400+
list.add(new Employee(5, "Hafiz", 28, 34000));
401+
402+
Collections.sort(list);
403+
404+
list.forEach((x) -> {
405+
System.out.println(x.id + ", " + x.name + ", " + x.age + ", " + x.salary);
406+
});
407+
}
408+
}
409+
```
410+
411+
এভাবে খুব সহজেই আমরা একটি অবজেক্টের লিস্ট সর্ট করতে পারি । তবে একটি বিষয় লক্ষ করার মত বিষয় হচ্ছে যে আপনাদের যে ২ প্রকারের সর্ট দেখানো হয়েছে অবজেক্টের লিস্টের ক্ষেত্রে এই দুই প্রকার কিন্তু একত্রেও ব্যাবহার করতে পারবেন । তবে সেক্ষেত্রে প্রায়োরিটি পাবে ক্লোজার ফাংশন । চলুন দেখি বিষয়টা কি একটু দেখে নেই ।
412+
413+
```java
414+
import java.util.ArrayList;
415+
import java.util.Collections;
416+
import java.util.List;
417+
418+
class Employee implements Comparable<Employee> {
419+
420+
int id;
421+
String name;
422+
int age;
423+
int salary;
424+
425+
public Employee(int id, String name, int age, int salary) {
426+
this.id = id;
427+
this.name = name;
428+
this.age = age;
429+
this.salary = salary;
430+
}
431+
432+
@Override
433+
public int compareTo(Employee t) {
434+
return this.age - t.age;
435+
}
436+
}
437+
438+
public class Main {
439+
440+
public static void main(String[] args) {
441+
442+
List<Employee> list = new ArrayList<>();
443+
list.add(new Employee(1, "Abul", 27, 35000));
444+
list.add(new Employee(2, "Babul", 25, 37000));
445+
list.add(new Employee(3, "Kabul", 29, 30000));
446+
list.add(new Employee(4, "Mofiz", 24, 36000));
447+
list.add(new Employee(5, "Hafiz", 28, 34000));
448+
449+
Collections.sort(list, ((Employee e1, Employee e2) -> (e2.salary + e1.salary)));
450+
451+
list.forEach((x) -> {
452+
System.out.println(x.id + ", " + x.name + ", " + x.age + ", " + x.salary);
453+
});
454+
}
455+
}
456+
```
457+
458+
এখানে যদিও `Employee` ক্লাস `Comparable` ইন্টারফেস ইমপ্লিমেন্ট করেছে এবং `compareTo` মেথডে বলে দেওয়া হয়েছে `age` এর অ্যাসেন্ডিং অর্ডারে সর্ট করতে হবে কিন্তু এটি সর্ট করবে `salary` এর ডিসেন্ডিং অর্ডারে । কেন সেটা করছে সেটা নিশ্চয় বুঝতে পেরেছেন ।
459+
460+
আপনারা চাইলে কিন্তু `List` এর অন্তর্গত `sort` মেথড ব্যাবহার করেও সর্ট করতে পারতেন । সেটা করার জন্য খুব বেশি কিছুই করতে হতনা । সেটি অলরেডি আপনারা জানেন কিভাবে সেটি করা যায় ।
461+
462+
```java
463+
list.sort(new Comparator<Employee>(){
464+
@Override
465+
public int compare(Employee t, Employee t1) {
466+
return t1.age - t.age;
467+
}
468+
469+
});
470+
```
471+
472+
বেসিক্যালি এভাবে খুব সহজেই একটি লিস্ট সর্ট করা যায় । আপনারা আরো বেশি আগ্রহী হলে ওরাকলের ডকুমেন্টেশন পড়তে পারেন । আরো বেশি পরিষ্কার হবে ধারনা ।
473+
474+
475+
#–-------চলবে--------#

0 commit comments

Comments
 (0)