ক কাস্টম অনুসারে বাছাই করা যায় যে ক খ এর আগে আসে এবং খ এর আগে খ আসে


11

আমার কাছে রঙগুলির একটি তালিকা রয়েছে:

গোলাপী, নীল, লাল, নীল, ধূসর, সবুজ, বেগুনি, কালো ... ইত্যাদি

List<String> listOfColors =  Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black");

কিছু ফলের রঙগুলিকে ফিল্টার করার মতো কিছু অন্তর্বর্তী ক্রিয়াকলাপ রয়েছে, এখন আমার কাছে ফিল্টারযুক্ত ফলাফল রয়েছে যেখানে আমি চাই যাতে সেগুলি সাজানো হয়:

নীল, কালো, নীল, ধূসর, সবুজ, গোলাপী, বেগুনি, লাল

আমি চেষ্টা করেছি :

List<String> collect = listOfColors.stream().sorted(String::compareToIgnoreCase)
        .collect(Collectors.toList());

এটি প্রত্যাশার মতো কাজ করে না।

আউটপুট নিম্নলিখিত:

কালো, নীল, নীল, সবুজ, ধূসর, গোলাপী, বেগুনি, লাল

আমি নিম্নলিখিত চাই:

নীল, কালো, নীল, ধূসর, সবুজ, গোলাপী, বেগুনি, লাল


2
গ্রে আগে নীল এবং সবুজ আগে আসা উচিত নয়?
রবীন্দ্র রণওয়ালা

3
auফলাফলটি ঠিক হওয়ার আগে রয়েছে
জেনস

2
@RavindraRanwala, নীল এর বি রাজধানী কিন্তু ফিরে s 'এর নয়।
বিশ্ব রত্না

2
আমি চেষ্টা করেছি, কিন্তু এটি এই নির্দিষ্ট আদেশ দেয় না। এটি [black, Blue, blue, green, Grey, Pink, purple, Red]@ ক্রাইলিস-অনস্ট্রাইকে দেয়
রবীন্দ্র রণওয়ালা

2
আপনি যদি কম কেসিংয়ের আগে ক্যাপিটাল কেসিং আসতে চান তবে কেসিং উপেক্ষা করা আপনার পছন্দসই জিনিস thing
তিপিম্ম

উত্তর:


8

আমার সমাধানটি হল Comparator.thenComparing()পদ্ধতিটি ব্যবহার করে দুটি ধাপে বাছাই করা ।

প্রথমে স্ট্রিংগুলি তুলনা করুন কেবল প্রথম অক্ষরকে উপেক্ষা করার ক্ষেত্রে। সুতরাং একই প্রথম অক্ষরযুক্ত গোষ্ঠীগুলি (যাই হোক না কেন ঘটনা যাই হোক না কেন) এগুলি এখনও অরসেটেড থেকে যায়। তারপরে দ্বিতীয় ধাপে সেই অনর্থিত সাব-গ্রুপগুলিকে বাছাই করতে স্বাভাবিক বর্ণানুক্রমিক বাছাইয়ের প্রয়োগ করুন।

List<String> listOfColors =  Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black");
Comparator<String> comparator = Comparator.comparing(s -> 
        Character.toLowerCase(s.charAt(0)));
listOfColors.sort(comparator.thenComparing(Comparator.naturalOrder()));
System.out.println(listOfColors);

এটি এখনও অপ্টিমাইজড হতে পারে তবে এটি পছন্দসই ফলাফল দেয়:

[Blue, black, blue, Grey, green, Pink, purple, Red]


এর পাঠযোগ্যতার জন্য একটি সম্পাদনা করেছেন Comparator। তবে হ্যাঁ, এটি কেবল স্ট্রিংয়ের প্রথম চরিত্রের সাথে তুলনা করে যা ওপি খুব বেশি জোর দেয়নি।
নমন

8

আপনি নিজের বিধিগুলি সংজ্ঞায়িত করতে রুলবেসডক্লেটর ব্যবহার করতে পারেন ।

কাস্টম নিয়মের উদাহরণ :

String rules = "< c,C < b,B";

উপরের নিয়মটি ডিকোড করা হয়েছে যে স্ট্রের সাথে তুলনা করার সময় Cবড় হাতের এবং ছোট হাতের অক্ষরের উভয়ের আগেই বড় হাতের এবং ছোট হাতের অক্ষর উপস্থিত হয় B

String customRules = "<A<a<B<b<C<c<D<d<E<e<F<f<G<g<H<h<I<i<J<j<K<k<L<l<M<m<N<n<O<o<P<p<Q<q<R<r<S<s<T<t<U<u<V<v<X<x<Y<y<Z<z";
RuleBasedCollator myRuleBasedCollator = new RuleBasedCollator(customRules);
Collections.sort(listOfColors,myRuleBasedCollator);
System.out.println(listOfColors);

আউটপুট:

[Blue, black, blue, Grey, green, Pink, purple, Red]

সম্পাদনা করুন:customRules হাত দ্বারা লেখার পরিবর্তে , আপনি এটি তৈরি করতে নীচের কোডটি ব্যবহার করতে পারেন।

String a = IntStream.range('a', 'z' + 1).mapToObj(c -> Character.toString((char) c))
        .flatMap(ch -> Stream
            .of("<", ch.toUpperCase(), "<", ch)).collect(Collectors.joining(""));

2
নির্মাণের String customRulesসাথে স্বয়ংক্রিয়তা হতে পারে IntStream:IntStream.range('a', 'z' + 1) .mapToObj(Character::toString) .flatMap(ch -> Stream.of("<", ch.toUpperCase(), "<", ch)) .collect(Collectors.joining(""))
lczapski

@ এলসিজেপসকি, কোনওভাবেই .mapToObj(Character::toString)সমাধান হবে না, আমার ধারণা আপনার ব্যবহার করা দরকার.mapToObj(c -> Character.toString((char) c))
বিশ্ব রত্ন

mapToObj(Character::toString)কেবল জাভা 11 বা আরও নতুনতে কাজ করে।
হোলার

@ হোলজার ওকে, আমি আমার সিস্টেমে চেষ্টা করেছি (জেডিকে -৮) এবং mapToObj(Character::toString)সমাধান হচ্ছিল না, তবে আমি ধারণাটি পছন্দ করেছি তাই আমার পছন্দ শেষ হয়েছে.mapToObj(c -> Character.toString((char) c))
বিশ্ব রত্ন

3
আমি পছন্দ করিIntStream.rangeClosed('a', 'z').flatMap(c -> IntStream.of(c,Character.toUpperCase(c))) .mapToObj(c -> Character.toString((char)c)) .collect(Collectors.joining("<", "<", ""));
হলগার

0

আপনার এমন একটি পদ্ধতি দরকার যা প্রথমে প্রতিটি অক্ষরের সাথে একটি সংবেদনশীল তুলনা করে, তারপরে যদি কোনও মিল থাকে তবে প্রতিটি অক্ষরের সাথে কেস সংবেদনশীল তুলনা করা হয়:

public static int compare(String s1, String s2)
{
    int len, i;
    if (s1.length()<s2.length()) {
        len = s1.length();
    } else {
        len = s2.length();
    }
    for (i=0;i<len;i++) {
        if (Character.toUpperCase(s1.charAt(i)) < Character.toUpperCase(s2.charAt(i))) {
            return -1;
        } else if (Character.toUpperCase(s1.charAt(i)) > Character.toUpperCase(s2.charAt(i))) {
            return 1;
        } else if (s1.charAt(i) < s2.charAt(i)) {
            return -1;
        } else if (s1.charAt(i) > s2.charAt(i)) {
            return 1;
        }
    }
    if (s1.length() < s2.length()) {
        return -1;
    } else if (s1.length() > s2.length()) {
        return 1;
    } else {
        return 0;
    }
}

তারপরে আপনি এই পদ্ধতিটি পাস করতে পারেন Stream.sorted

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.