আমি এর মধ্যে পার্থক্য দিকে তাকিয়ে করে থাকেন Collections.sort
এবং list.sort
, বিশেষ করে ব্যবহার সংক্রান্ত Comparator
স্ট্যাটিক পদ্ধতি এবং কিনা PARAM ধরনের ল্যামডা এক্সপ্রেশন প্রয়োজন হয়। আমরা শুরু করার আগে, আমি জানি যে আমি পদ্ধতি উল্লেখগুলি ব্যবহার করতে পারি, উদাহরণস্বরূপ Song::getTitle
আমার সমস্যাগুলি কাটিয়ে উঠতে, তবে এখানে আমার ক্যোয়ারী তেমন কিছু নয় যা আমি ঠিক করতে চাই তবে এমন একটি উত্তর যার আমি উত্তর চাই, অর্থাৎ কেন জাভা সংকলক এটিকে এভাবে পরিচালনা করছেন? ।
এগুলি আমার সন্ধান ধরুন আমাদের ArrayList
কয়েকটি ধরণের Song
গান রয়েছে এবং এর সাথে 3 টি স্ট্যান্ডার্ড গেট পদ্ধতি রয়েছে:
ArrayList<Song> playlist1 = new ArrayList<Song>();
//add some new Song objects
playlist.addSong( new Song("Only Girl (In The World)", 235, "Rhianna") );
playlist.addSong( new Song("Thinking of Me", 206, "Olly Murs") );
playlist.addSong( new Song("Raise Your Glass", 202,"P!nk") );
এখানে উভয় প্রকারের বাছাই পদ্ধতিতে কল রয়েছে যা কোনও সমস্যা নেই:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle()));
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle()));
আমি চেইন করতে শুরু করার thenComparing
সাথে সাথে নিম্নলিখিতগুলি ঘটে:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
অর্থাত্ সিনট্যাক্স ত্রুটি কারণ এটি p1
আর প্রকারটি জানে না। সুতরাং এটি ঠিক করার জন্য আমি Song
প্রথম প্যারামিটারে (তুলনা করার) টাইপ যুক্ত করব :
Collections.sort(playlist1,
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
playlist1.sort(
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
এখন এখানে বিবেচনা অংশ আসে। পি laylist1.sort
, অর্থাৎ তালিকার জন্য, নিম্নলিখিত thenComparing
সংস্থাগুলির জন্য সমস্ত সংকলন ত্রুটি সমাধান করে। তবে Collections.sort
এটির জন্য এটি প্রথমটির জন্য সমাধান করে তবে শেষটি নয়। আমি পরীক্ষামূলকভাবে আরও কয়েকটি অতিরিক্ত কল যুক্ত করেছি thenComparing
এবং এটি সর্বদা সর্বশেষের জন্য একটি ত্রুটি দেখায়, যদি না আমি (Song p1)
প্যারামিটারটির জন্য না রাখি ।
এখন আমি এটি তৈরি করে TreeSet
এবং ব্যবহার করে আরও পরীক্ষা করে দেখেছি Objects.compare
:
int x = Objects.compare(t1, t2,
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
Set<Song> set = new TreeSet<Song>(
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
একই জিনিসটি ঘটে যায়, এর জন্য TreeSet
, কোনও সংকলন ত্রুটি নেই তবে Objects.compare
শেষ কলটির জন্য thenComparing
ত্রুটি দেখানো হয়।
কেউ কি দয়া করে ব্যাখ্যা করতে পারেন যে এটি কেন ঘটছে এবং কেন (Song p1)
কেবল তুলনামূলক পদ্ধতিটি thenComparing
কল করার সময় (কোনও কল ছাড়াই ) কেন ব্যবহার করার প্রয়োজন নেই ।
একই বিষয়ে অন্য একটি ক্যোয়ারী হ'ল আমি যখন এটি করি TreeSet
:
Set<Song> set = new TreeSet<Song>(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
অর্থাত্ Song
তুলনা পদ্ধতি কলের জন্য প্রথম ল্যাম্বদা প্যারামিটার থেকে টাইপটি সরিয়ে ফেলুন , এটি তুলনার কলের অধীনে সিনট্যাক্স ত্রুটিগুলি দেখায় এবং thenComparing
চূড়ান্ত কলটিতে নয় তবে প্রথমটি thenComparing
যা ঘটছিল তার প্রায় বিপরীত! অন্যদিকে, অন্য 3 টি উদাহরণের জন্য অর্থাত্ সহ Objects.compare
, List.sort
এবং Collections.sort
আমি যখন প্রথম Song
প্যারাম টাইপটি সরিয়ে ফেলি এটি সমস্ত কলগুলির জন্য সিনট্যাক্স ত্রুটিগুলি দেখায়।
অগ্রিম ধন্যবাদ.
এক্সিলিপ কেপলার এসআর 2-এ আমি যে ত্রুটিগুলি পেয়েছিলাম তার স্ক্রিনশট অন্তর্ভুক্ত করার জন্য সম্পাদিত, যা আমি এখন থেকে পেয়েছি তা হল এক্স্লিপ সুনির্দিষ্ট কারণ কমান্ড-লাইনে JDK8 জাভা সংকলক ব্যবহার করার পরে এটি ঠিক আছে iles