আমি কাস্টম শৃঙ্খলা অর্ডার সংজ্ঞায়িত করতে তুলনামূলক কীভাবে ব্যবহার করব?


91

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

তার জন্য আমি জাভা ব্যবহার করার চেষ্টা করি Comparatorএবং Comparableএটি কেবল বর্ণানুক্রমিক ক্রম অনুসারে বাছাই করতে দেয়।

সুতরাং, যে কেউ কৌশলটি ব্যবহারের কৌশল প্রয়োগের জন্য আমাকে গাইড করতে পারে যাতে বাছাই করা আরও দ্রুত হয়।

class Car implements Comparable<Car>
{
    private String name;
    private String color;

    public Car(String name, String color){
        this.name = name;
        this.color = color;
    }

    //Implement the natural order for this class
    public int compareTo(Car c) {
        return name.compareTo(c.name);
    }

    static class ColorComparator implements Comparator<Car> {
        public int compare(Car c1, Car c2) {
            String a1 = c1.color;
            String a2 = c2.color;
            return a1.compareTo(a2);
        }
    }

    public static void main(String[] args) {
        List<Car> carList = new ArrayList<>();
        List<String> sortOrder = new ArrayList<>();

        carList.add(new Car("Ford","Silver"));
        carList.add(new Car("Tes","Blue"));
        carList.add(new Car("Honda","Magenta"));

        sortOrder.add("Silver");
        sortOrder.add("Magenta");
        sortOrder.add("Blue");

        // Now here I am confuse how to implement my custom sort             
    }
}

উত্তর:


101

আমি আপনাকে স্ট্রিংস ব্যবহার না করে আপনার গাড় রঙের জন্য এনাম তৈরি করার পরামর্শ দিচ্ছি এবং এনামের প্রাকৃতিক ক্রম হ'ল আপনি যে ধরণের স্থিরতা ঘোষণা করবেন তা হ'ল।

public enum PaintColors {
    SILVER, BLUE, MAGENTA, RED
}

এবং

 static class ColorComparator implements Comparator<CarSort>
 {
     public int compare(CarSort c1, CarSort c2)
     {
         return c1.getColor().compareTo(c2.getColor());
     }
 }

আপনি স্ট্রিংটিকে পেইন্টকালারে পরিবর্তন করুন এবং তারপরে মূলত আপনার গাড়ির তালিকার তালিকায় পরিণত হয়:

carList.add(new CarSort("Ford Figo",PaintColor.SILVER));

...

Collections.sort(carList, new ColorComparator());

আমি এই উদাহরণটি কীভাবে চালাব Color রঙিনকম্পেরেটরটিতে পেন্টেল অনুবাদটি অ্যাক্সেস করা হয় না ould আপনি কীভাবে মূল পদ্ধতিটি দেখতে পাবেন তা চিত্রিত করেছেন।
দীপক

আউটপুট কি? এটা কি সর্বদা প্রথমে চতুর?
দীপক

@ প্রদীপ: হ্যাঁ, enumমানগুলির প্রাকৃতিক ক্রম হ'ল তার মানগুলি সংজ্ঞায়িত করা হয়।
জোছিম সউর

4
@ সানপ্যাট্রিকফ্লোয়েড আমি মনে করি না যে এনামগুলির প্রাকৃতিক আদেশের উপর নির্ভর করা একটি সেরা অনুশীলন।
মাইক

4
@ মাইকে আমি একমত নই, তবে উভয় দৃষ্টিভঙ্গির জন্য বৈধ যুক্তি রয়েছে
সান প্যাট্রিক ফ্লয়েড

57

এটি সম্পর্কে:

List<String> definedOrder = // define your custom order
    Arrays.asList("Red", "Green", "Magenta", "Silver");

Comparator<Car> comparator = new Comparator<Car>(){

    @Override
    public int compare(final Car o1, final Car o2){
        // let your comparator look up your car's color in the custom order
        return Integer.valueOf(
            definedOrder.indexOf(o1.getColor()))
            .compareTo(
                Integer.valueOf(
                    definedOrder.indexOf(o2.getColor())));
    }
};

নীতিগতভাবে, আমি সম্মত হই যে একটি ব্যবহার enumকরা একটি আরও ভাল পদ্ধতির, তবে এই সংস্করণটি আরও নমনীয় কারণ এটি আপনাকে বিভিন্ন ধরণের অর্ডার সংজ্ঞায়িত করতে দেয়।

হালনাগাদ

পেয়ারার এই কার্যকারিতাটি তার Orderingশ্রেণিতে বেক করা হয়েছে :

List<String> colorOrder = ImmutableList.of("red","green","blue","yellow");
final Ordering<String> colorOrdering = Ordering.explicit(colorOrder);
Comparator<Car> comp = new Comparator<Car>() {
    @Override
    public int compare(Car o1, Car o2) {
        return colorOrdering.compare(o1.getColor(),o2.getColor());
    }
}; 

এই সংস্করণটি কিছুটা কম ভার্বোস।


আবার আপডেট

জাভা 8 তুলনাকারীকে আরও কম ভার্বোস করে তোলে:

Comparator<Car> carComparator = Comparator.comparing(
        c -> definedOrder.indexOf(c.getColor()));

আপনি কি দয়া করে এই প্রশ্নটি সন্ধান করতে পারেন? তোমাকে ধন্যবাদ. stackoverflow.com/questions/61934313/...
user2048204

Comparator<Car> carComparator = Comparator.comparing( c -> definedOrder.indexOf(c.getColor())); সংকলনের ত্রুটি ছুড়ে
দিচ্ছে

@ সন্তোষ কুমার এখানে একটি কার্যকরী উদাহরণ: আইডোন.কম
সান প্যাট্রিক ফ্লয়েড

25

লাইনে তুলনামূলক ...

List<Object> objList = findObj(name);
Collections.sort(objList, new Comparator<Object>() {
    @Override
    public int compare(Object a1, Object a2) {
        return a1.getType().compareToIgnoreCase(a2.getType());
    }
});

11

আমি মনে করি এটি নিম্নলিখিত হিসাবে করা যেতে পারে:

class ColorComparator implements Comparator<CarSort>
{
    private List<String> sortOrder;
    public ColorComparator (List<String> sortOrder){
        this.sortOrder = sortOrder;
    }

    public int compare(CarSort c1, CarSort c2)
    {
        String a1 = c1.getColor();
        String a2 = c2.getColor();
        return sortOrder.indexOf(a1) - sortOrder.indexOf(a2);
     }
 }

বাছাইয়ের জন্য এটি ব্যবহার করুন:

Collections.sort(carList, new ColorComparator(sortOrder));

7

শন এবং ইল্লেক্সের উত্তরের মতোই আমাকে কিছু করতে হয়েছিল।
তবে স্পষ্টভাবে সাজানোর ক্রমটি সংজ্ঞায়িত করার জন্য আমার কাছে অনেকগুলি বিকল্প ছিল এবং কেবলমাত্র নির্দিষ্ট (অ-প্রাকৃতিক) ক্রমে তালিকার সামনের নির্দিষ্ট এন্ট্রিগুলি ভাসানোর প্রয়োজন।
আশা করি এটি অন্য কারও পক্ষে সহায়ক।

public class CarComparator implements Comparator<Car> {

    //sort these items in this order to the front of the list 
    private static List<String> ORDER = Arrays.asList("dd", "aa", "cc", "bb");

    public int compare(final Car o1, final Car o2) {
        int result = 0;
        int o1Index = ORDER.indexOf(o1.getName());
        int o2Index = ORDER.indexOf(o2.getName());
        //if neither are found in the order list, then do natural sort
        //if only one is found in the order list, float it above the other
        //if both are found in the order list, then do the index compare
        if (o1Index < 0 && o2Index < 0) result = o1.getName().compareTo(o2.getName());
        else if (o1Index < 0) result = 1;
        else if (o2Index < 0) result = -1;
        else result = o1Index - o2Index;
        return result;
    }

//Testing output: dd,aa,aa,cc,bb,bb,bb,a,aaa,ac,ac,ba,bd,ca,cb,cb,cd,da,db,dc,zz
}

4

আমি এরকম কিছু করব:

List<String> order = List.of("Red", "Green", "Magenta", "Silver");

Comparator.comparing(Car::getColor(), Comparator.comparingInt(c -> order.indexOf(c)))

সমস্ত ক্রেডিট @ সিয়ান প্যাট্রিক ফ্লয়েডে যায় :)


3

জাভা 8-তে আপনি এরকম কিছু করতে পারেন:

আপনার প্রথমে একটি এনুম প্রয়োজন:

public enum Color {
    BLUE, YELLOW, RED
}

গাড়ির ক্লাস:

public class Car {

    Color color;

    ....

    public Color getColor() {
        return color;
    }

    public void setColor(Color color) {
        this.color = color;
    }
}

এবং তারপরে, আপনার গাড়ী তালিকা ব্যবহার করে, আপনি সহজভাবে এটি করতে পারেন:

Collections.sort(carList, Comparator:comparing(CarSort::getColor));

এটি কোনও কাস্টম বাছাই নয়।
জাইগিম্যান্টাস

তদতিরিক্ত, এটি করার কোনও "কার্যকরী" উপায় নয় ... এর পার্শ্ব প্রতিক্রিয়া রয়েছে !!
ট্রাইকোর

2

একটি এনাম প্রকার হিসাবে সংজ্ঞায়িত করুন

public enum Colors {
     BLUE, SILVER, MAGENTA, RED
}

ডাটা টাইপ পরিবর্তন colorথেকে Stringথেকে Colors পরিবর্তন রিটার্ন টাইপ এবং গেটার এবং সেটার রং এর পদ্ধতির যুক্তি টাইপColors

তুলনামূলক প্রকার নীচে হিসাবে সংজ্ঞায়িত করুন

static class ColorComparator implements Comparator<CarSort>
{
    public int compare(CarSort c1, CarSort c2)
    {
        return c1.getColor().compareTo(c2.getColor());
    }
}

তালিকায় উপাদান যুক্ত করার পরে, তালিকা এবং তুলনাকারী বস্তুগুলি আর্গুমেন্ট হিসাবে পাস করে সংগ্রহের কল করুন বাছাইয়ের পদ্ধতি

যেমন, Collections.sort(carList, new ColorComparator()); তারপরে মুদ্রণ করুনListIterator

পূর্ণ শ্রেণি বাস্তবায়ন নিম্নরূপ:

package test;

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

public class CarSort implements Comparable<CarSort>{

    String name;
    Colors color;

    public CarSort(String name, Colors color){
        this.name = name;
        this.color = color;
    } 

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Colors getColor() {
        return color;
    }
    public void setColor(Colors color) {
        this.color = color;
    }

    //Implement the natural order for this class
    public int compareTo(CarSort c)
    {
        return getName().compareTo(c.getName());
    }

    static class ColorComparator implements Comparator<CarSort>
    {
        public int compare(CarSort c1, CarSort c2)
        {
            return c1.getColor().compareTo(c2.getColor());
        }
    }

    public enum Colors {
         BLUE, SILVER, MAGENTA, RED
    }

     public static void main(String[] args)
     {
         List<CarSort> carList = new ArrayList<CarSort>();
         List<String> sortOrder = new ArrayList<String>();

         carList.add(new CarSort("Ford Figo",Colors.SILVER));
         carList.add(new CarSort("Santro",Colors.BLUE));
         carList.add(new CarSort("Honda Jazz",Colors.MAGENTA));
         carList.add(new CarSort("Indigo V2",Colors.RED));
         Collections.sort(carList, new ColorComparator());

         ListIterator<CarSort> itr=carList.listIterator();
         while (itr.hasNext()) {
            CarSort carSort = (CarSort) itr.next();
            System.out.println("Car colors: "+carSort.getColor());
        }
     }
}

0

কেবল সাধারণ লুপগুলি ব্যবহার:

public static void compareSortOrder (List<String> sortOrder, List<String> listToCompare){
        int currentSortingLevel = 0;
        for (int i=0; i<listToCompare.size(); i++){
            System.out.println("Item from list: " + listToCompare.get(i));
            System.out.println("Sorting level: " + sortOrder.get(currentSortingLevel));
            if (listToCompare.get(i).equals(sortOrder.get(currentSortingLevel))){

            } else {
                try{
                    while (!listToCompare.get(i).equals(sortOrder.get(currentSortingLevel)))
                        currentSortingLevel++;
                    System.out.println("Changing sorting level to next value: " + sortOrder.get(currentSortingLevel));
                } catch (ArrayIndexOutOfBoundsException e){

                }

            }
        }
    }

এবং তালিকা অনুসারে বাছাই করুন

public static List<String> ALARMS_LIST = Arrays.asList(
            "CRITICAL",
            "MAJOR",
            "MINOR",
            "WARNING",
            "GOOD",
            "N/A");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.