सॉर्ट करने के लिए जावा में तुलनित्र का उपयोग कैसे करें


169

मैंने सीखा कि तुलनीय का उपयोग कैसे करें लेकिन मुझे तुलनित्र से कठिनाई हो रही है। मुझे अपने कोड में कोई त्रुटि हो रही है:

Exception in thread "main" java.lang.ClassCastException: New.People cannot be cast to java.lang.Comparable
 at java.util.Arrays.mergeSort(Unknown Source)
 at java.util.Arrays.sort(Unknown Source)
 at java.util.Collections.sort(Unknown Source)
 at New.TestPeople.main(TestPeople.java:18)

यहाँ मेरा कोड है:

import java.util.Comparator;

public class People implements Comparator {
   private int id;
   private String info;
   private double price;

   public People(int newid, String newinfo, double newprice) {
       setid(newid);
       setinfo(newinfo);
       setprice(newprice);
   }

   public int getid() {
       return id;
   }

   public void setid(int id) {
       this.id = id;
   }

   public String getinfo() {
       return info;
   }

   public void setinfo(String info) {
       this.info = info;
   }

   public double getprice() {
       return price;
   }

   public void setprice(double price) {
       this.price = price;
   }

   public int compare(Object obj1, Object obj2) {
       Integer p1 = ((People) obj1).getid();
       Integer p2 = ((People) obj2).getid();

       if (p1 > p2) {
           return 1;
       } else if (p1 < p2){
           return -1;
       } else {
           return 0;
       }
    }
}
import java.util.ArrayList;
import java.util.Collections;

public class TestPeople {
    public static void main(String[] args) {
        ArrayList peps = new ArrayList();

        peps.add(new People(123, "M", 14.25));
        peps.add(new People(234, "M", 6.21));
        peps.add(new People(362, "F", 9.23));
        peps.add(new People(111, "M", 65.99));
        peps.add(new People(535, "F", 9.23));

        Collections.sort(peps);

        for (int i = 0; i < peps.size(); i++){
            System.out.println(peps.get(i));
        }
    }
}

मेरा मानना ​​है कि यह तुलना विधि में कास्टिंग के साथ कुछ करना है लेकिन मैं इसके साथ खेल रहा था और अभी भी इसका समाधान नहीं ढूंढ सका



1
नए कोड stackoverflow.com/questions/2770321/… में कच्चे प्रकार का उपयोग न करें ; उपयोग Comparator<People>, Comparable<People>, List<People>, आदि
polygenelubricants

मैंने तुलनाकर्ता <लोग> को बदल दिया है, लेकिन जब मैं Arraylist <People> को बदलता हूं, तो कलेक्शंस.सॉर्ट को एक त्रुटि मिलती है
Dan

1
के 2 अधिभार के बारे में मेरा जवाब पढ़ें sort। यदि आपको उपयोग करने के लिए कहा गया है Comparator<People>, तो 2-तर्क का उपयोग करें sort, न कि 1-तर्क का sort(जिसकी आवश्यकता है People implements Comparable<People>)।
पॉलीजेन लुब्रिकेंट

जवाबों:


212

आपके उदाहरण वर्ग के साथ कुछ अजीब बातें हैं:

  • यह लोग कहा जाता है यह है, जबकि एक priceऔरinfo (वस्तुओं, नहीं लोगों के लिए अधिक कुछ);
  • जब किसी चीज का बहुवचन के रूप में एक वर्ग का नामकरण होता है, तो यह सुझाव देता है कि यह एक से अधिक चीजों का अमूर्त है।

वैसे भी, यहाँ कैसे उपयोग करने का एक डेमो है Comparator<T>:

public class ComparatorDemo {

    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Joe", 24),
                new Person("Pete", 18),
                new Person("Chris", 21)
        );
        Collections.sort(people, new LexicographicComparator());
        System.out.println(people);
        Collections.sort(people, new AgeComparator());
        System.out.println(people);
    }
}

class LexicographicComparator implements Comparator<Person> {
    @Override
    public int compare(Person a, Person b) {
        return a.name.compareToIgnoreCase(b.name);
    }
}

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person a, Person b) {
        return a.age < b.age ? -1 : a.age == b.age ? 0 : 1;
    }
}

class Person {

    String name;
    int age;

    Person(String n, int a) {
        name = n;
        age = a;
    }

    @Override
    public String toString() {
        return String.format("{name=%s, age=%d}", name, age);
    }
}

संपादित करें

और एक बराबर जावा 8 डेमो इस तरह दिखेगा:

public class ComparatorDemo {

    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Joe", 24),
                new Person("Pete", 18),
                new Person("Chris", 21)
        );
        Collections.sort(people, (a, b) -> a.name.compareToIgnoreCase(b.name));
        System.out.println(people);
        Collections.sort(people, (a, b) -> a.age < b.age ? -1 : a.age == b.age ? 0 : 1);
        System.out.println(people);
    }
}

8
युगांतरकारी और पूर्णांक की समान तुलनाओं को वापस करने के लिए सरल बनाया जा सकता हैa.age - b.age
एस्को लुओंटोला

13
@Esko: तुलना-दर-घटाव "चाल" सामान्य के लिए टूट गया है int stackoverflow.com/questions/2728793/...
polygenelubricants

1
@ ईस्को: पॉलीजेनबेलिकेंट्स का उल्लेख करने के कारण, मैं हमेशा इसे हमेशा की तरह ही करता हूं, भले ही एक उम्र के लिए (जो बहुत बड़ी नहीं होगी) जैसा कि आप उल्लेख करते हैं, वैसे ही घटाव भी होगा।
बार्ट कीर्स

3
@साइकिरण, आप कर सकते हैं। लेकिन लागू करते समय Comparable, आपको तुलना करने के लिए एकल विशेषता का चयन करना होगा। किसी व्यक्ति के मामले में, कई विशेषताएं हैं जिनकी तुलना इस पर की जा सकती है: आयु, लंबाई, लिंग, नाम इत्यादि। इस मामले में, इन तुलनाओं को करने वाले कुछ जोड़े प्रदान करना आसान है।
बार्ट कियर्स

1
@ फोर्सबर्ग नहीं, यह अनिवार्य नहीं है, लेकिन (अत्यधिक) उचित है। देखें: stackoverflow.com/questions/94361/…
बार्ट किपर्स

161

यहां एक छोटा शॉर्ट टेम्प्लेट है जो तुरंत छंटनी करने के लिए है:

Collections.sort(people,new Comparator<Person>(){
   @Override
   public int compare(final Person lhs,Person rhs) {
     //TODO return 1 if rhs should be before lhs 
     //     return -1 if lhs should be before rhs
     //     return 0 otherwise (meaning the order stays the same)
     }
 });

यदि यह याद रखना मुश्किल है, तो बस याद रखने की कोशिश करें कि यह समान है (संख्या के संकेत के संदर्भ में):

 lhs-rhs 

यदि आप बढ़ते क्रम में क्रमबद्ध करना चाहते हैं तो: सबसे छोटी संख्या से लेकर सबसे बड़ी संख्या तक।


3
@ 40Plot, वे स्थिति के लिए हैं, उनके साथ एक शासक या अक्ष चित्र।
यूजीन

@android डेवलपर, यह याद रखने की ट्रिक का उल्लेख करने के लिए धन्यवाद कि किस ऑर्डर के लिए वापस लौटना है। :)
गौर १

अब तक की सबसे अच्छी व्याख्या compare()
मुहम्मद बाबर

java.util.Comparator
विराज सिंह

@VirajSingh सवाल इस वर्ग के बारे में था, इसलिए निश्चित रूप से यह वही है जिसके बारे में मैं बात कर रहा हूँ ...
Android डेवलपर

39

People implements Comparable<People>इसके बजाय का उपयोग करें ; इसके लिए प्राकृतिक आदेश को परिभाषित करता हैPeople

A Comparator<People>को इसके अलावा परिभाषित किया जा सकता है, लेकिनPeople implements Comparator<People> चीजों को करने का सही तरीका नहीं है।

दो अधिभार Collections.sortअलग-अलग हैं:

  • <T extends Comparable<? super T>> void sort(List<T> list)
    • Comparableअपने प्राकृतिक आदेश का उपयोग करके वस्तुओं को सॉर्ट करता है
  • <T> void sort(List<T> list, Comparator<? super T> c)
    • संगत का उपयोग करके कुछ भी कहता है Comparator

आप एक को सॉर्ट करने की कोशिश करके दोनों को भ्रमित कर रहे हैं Comparator(जो फिर से ऐसा क्यों है, इससे कोई मतलब नहीं है Person implements Comparator<Person>)। फिर से, उपयोग करने के लिए Collections.sort, आपको इनमें से एक सच होने की आवश्यकता है:

  • प्रकार होना चाहिए Comparable(1-arg का उपयोग करें sort)
  • Comparatorप्रकार के लिए एक प्रदान किया जाना चाहिए (2-आर्ग का उपयोग करें sort)

संबंधित सवाल


इसके अलावा, नए कोड में कच्चे प्रकार का उपयोग न करें । कच्चे प्रकार असुरक्षित होते हैं, और यह केवल संगतता के लिए प्रदान किया जाता है।

इसके बजाय, यह है:

ArrayList peps = new ArrayList(); // BAD!!! No generic safety!

आपको इस तरह के प्रकार के सामान्य घोषणा पत्र का उपयोग करना चाहिए:

List<People> peps = new ArrayList<People>(); // GOOD!!!

फिर आप पाएंगे कि आपका कोड भी संकलित नहीं है !! यह एक अच्छी बात होगी, क्योंकि कोड के साथ कुछ गड़बड़ है ( Personनहीं है implements Comparable<Person>), लेकिन क्योंकि आपने कच्चे प्रकार का उपयोग किया था, इसलिए कंपाइलर ने इसके लिए जांच नहीं की , और इसके बजाय आपको एकClassCastException रन-टाइम मिलता है !!!

यह आपको हमेशा नए कोड में टाइप करने योग्य सामान्य प्रकारों का उपयोग करने के लिए मना करना चाहिए। हमेशा।

यह सभी देखें


तुलनित्र बनाम तुलनीय की व्याख्या बहुत उपयोगी है
अब्दुल

18

संपूर्णता के लिए, यहां एक सरल एक-लाइनर compareविधि है:

Collections.sort(people, new Comparator<Person>() {
    @Override
    public int compare(Person lhs, Person rhs) {  
        return Integer.signum(lhs.getId() - rhs.getId());  
    }
});

2
का उपयोग करने के लिए सराहना कीsignum
msysmilu

1
@NumberFour "lhs.getId () - rhs.getId ()" का उपयोग नहीं किया जाना चाहिए, इसमें पूर्णांक अतिप्रवाह के परिवर्तन हैं।
niraj.nijju

स्ट्रिंग के लिए "वापसी lhs.getName ()। तुलना (rhs.getName ());"।
अली अहमद

1
Integer.compare(lhs.getId(), rhs.getId());एक बेहतर तरीका है। जैसा कि @ niraj.nijju ने कहा कि घटाव अतिप्रवाह का कारण बन सकता है।
नरेन्द्र-चौधरी

12

जावा 8 ने कंपैरिटर बनाने का एक नया तरीका जोड़ा, जो आपको लिखना है, कम्पैरेटर.कॉमपरिंग कोड की मात्रा को कम करता है । इसके अलावा तुलनित्र की जाँच करें

यहाँ एक नमूना है

import org.junit.Test;

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

import static org.junit.Assert.assertTrue;

public class ComparatorTest {

    @Test
    public void test() {
        List<Person> peopleList = new ArrayList<>();
        peopleList.add(new Person("A", 1000));
        peopleList.add(new Person("B", 1));
        peopleList.add(new Person("C", 50));
        peopleList.add(new Person("Z", 500));
        //sort by name, ascending
        peopleList.sort(Comparator.comparing(Person::getName));
        assertTrue(peopleList.get(0).getName().equals("A"));
        assertTrue(peopleList.get(peopleList.size() - 1).getName().equals("Z"));
        //sort by name, descending
        peopleList.sort(Comparator.comparing(Person::getName).reversed());
        assertTrue(peopleList.get(0).getName().equals("Z"));
        assertTrue(peopleList.get(peopleList.size() - 1).getName().equals("A"));
        //sort by age, ascending
        peopleList.sort(Comparator.comparing(Person::getAge));
        assertTrue(peopleList.get(0).getAge() == 1);
        assertTrue(peopleList.get(peopleList.size() - 1).getAge() == 1000);
        //sort by age, descending
        peopleList.sort(Comparator.comparing(Person::getAge).reversed());
        assertTrue(peopleList.get(0).getAge() == 1000);
        assertTrue(peopleList.get(peopleList.size() - 1).getAge() == 1);
    }

    class Person {

        String name;
        int age;

        Person(String n, int a) {
            name = n;
            age = a;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }



}

4

आप तुलनीय लागू करना चाहते हैं, तुलनाकर्ता नहीं। आपको तुलना विधि को लागू करने की आवश्यकता है। तुम हालांकि करीब हो। तुलनित्र एक "3rd पार्टी" तुलना दिनचर्या है। तुलनीय है कि इस वस्तु की तुलना दूसरे के साथ की जा सकती है।

public int compareTo(Object obj1) {
  People that = (People)obj1;
  Integer p1 = this.getId();
  Integer p2 = that.getid();

  if (p1 > p2 ){
   return 1;
  }
  else if (p1 < p2){
   return -1;
  }
  else
   return 0;
 }

ध्यान दें, आप getId..just मामले में नल के लिए जाँच कर सकते हैं।


मैं यह उल्लेख करना भूल गया कि यह होमवर्क था, मुझे विशेष रूप से तुलनित्र का उपयोग करने के लिए कहा गया था
दान

2

यहां एक कंपैरिटर का उदाहरण दिया गया है जो कि किसी भी जीरो arg मेथड के लिए काम करेगा जो एक कंपैरिबल लौटाता है। क्या ऐसा कुछ jdk या लाइब्रेरी में मौजूद है?

import java.lang.reflect.Method;
import java.util.Comparator;

public class NamedMethodComparator implements Comparator<Object> {

    //
    // instance variables
    //

    private String methodName;

    private boolean isAsc;

    //
    // constructor
    //

    public NamedMethodComparator(String methodName, boolean isAsc) {
        this.methodName = methodName;
        this.isAsc = isAsc;
    }

    /**
     * Method to compare two objects using the method named in the constructor.
     */
    @Override
    public int compare(Object obj1, Object obj2) {
        Comparable comp1 = getValue(obj1, methodName);
        Comparable comp2 = getValue(obj2, methodName);
        if (isAsc) {
            return comp1.compareTo(comp2);
        } else {
            return comp2.compareTo(comp1);
        }
    }

    //
    // implementation
    //

    private Comparable getValue(Object obj, String methodName) {
        Method method = getMethod(obj, methodName);
        Comparable comp = getValue(obj, method);
        return comp;
    }

    private Method getMethod(Object obj, String methodName) {
        try {
            Class[] signature = {};
            Method method = obj.getClass().getMethod(methodName, signature);
            return method;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

    private Comparable getValue(Object obj, Method method) {
        Object[] args = {};
        try {
            Object rtn = method.invoke(obj, args);
            Comparable comp = (Comparable) rtn;
            return comp;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

}

यह वास्तव में बहुत अच्छा है!
ज़िरोव कोन्स्टेंटिन

2

परिपूर्णता के लिए।

Java8 का उपयोग करना

people.sort(Comparator.comparingInt(People::getId));

अगर तुम चाहो तो descending order

people.sort(Comparator.comparingInt(People::getId).reversed());

क्या होता है जब सूची में दो वस्तुओं का उपयोग समान संपत्ति मूल्यों के साथ किया जाता है, जो इस मामले में है, जो है People::getId?
कोक हाउ तेह

.thenComparing()क्लैश होने पर आप एक क्लॉज जोड़ सकते हैं ।
अंकित शर्मा

अगर नहीं है तो परिणाम में क्या होगा .thenComparing()?
कोक हाउ तेह

फिर यह उस क्रम पर निर्भर करता है जिसमें रिकॉर्ड मौजूद थे, geeksforgeeks.org/stability-in-sorting-algorithms
अंकित शर्मा

मुझे कैसे पता चलेगा कि इस्तेमाल किया गया छँटाई एल्गोरिथ्म स्थिर या अस्थिर है?
कोक हाउ तेह

1
public static Comparator<JobSet> JobEndTimeComparator = new Comparator<JobSet>() {
            public int compare(JobSet j1, JobSet j2) {
                int cost1 = j1.cost;
                int cost2 = j2.cost;
                return cost1-cost2;
            }
        };

1

समाधान को निम्नलिखित तरीके से अनुकूलित किया जा सकता है: सबसे पहले, एक निजी आंतरिक वर्ग का उपयोग करें क्योंकि खेतों के लिए गुंजाइश है टेस्ट क्लास लोगों को घेरना है ताकि कक्षा के कार्यान्वयन को लोग बाहरी दुनिया के संपर्क में न आएं। इसे APIthat बनाने के संदर्भ में समझा जा सकता है कि लोगों की एक क्रमबद्ध सूची की उम्मीद है दूसरा, लांबा अभिव्यक्ति (जावा 8) का उपयोग करता है जो कोड को कम करता है, इसलिए विकास प्रयास

इसलिए कोड इस प्रकार होगा:

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

public class TestPeople {
    public static void main(String[] args) {
        ArrayList<People> peps = new ArrayList<>();// Be specific, to avoid
                                                    // classCast Exception

        TestPeople test = new TestPeople();

        peps.add(test.new People(123, "M", 14.25));
        peps.add(test.new People(234, "M", 6.21));
        peps.add(test.new People(362, "F", 9.23));
        peps.add(test.new People(111, "M", 65.99));
        peps.add(test.new People(535, "F", 9.23));

        /*
         * Collections.sort(peps);
         * 
         * for (int i = 0; i < peps.size(); i++){
         * System.out.println(peps.get(i)); }
         */

        // The above code can be replaced by followin:

        peps.sort((People p1, People p2) -> p1.getid() - p2.getid());

        peps.forEach((p) -> System.out.println(" " + p.toString()));

    }

    private class People {
        private int id;

        @Override
        public String toString() {
            return "People [id=" + id + ", info=" + info + ", price=" + price + "]";
        }

        private String info;
        private double price;

        public People(int newid, String newinfo, double newprice) {
            setid(newid);
            setinfo(newinfo);
            setprice(newprice);
        }

        public int getid() {
            return id;
        }

        public void setid(int id) {
            this.id = id;
        }

        public String getinfo() {
            return info;
        }

        public void setinfo(String info) {
            this.info = info;
        }

        public double getprice() {
            return price;
        }

        public void setprice(double price) {
            this.price = price;
        }
    }
}

0

आपको ओवरलोड सॉर्ट (पेप्स, नए पीपल ()) विधि का उपयोग करना चाहिए

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

public class Test 
{
    public static void main(String[] args) 
    {
        List<People> peps = new ArrayList<>();

        peps.add(new People(123, "M", 14.25));
        peps.add(new People(234, "M", 6.21));
        peps.add(new People(362, "F", 9.23));
        peps.add(new People(111, "M", 65.99));
        peps.add(new People(535, "F", 9.23));

        Collections.sort(peps, new People().new ComparatorId());

        for (int i = 0; i < peps.size(); i++)
        {
            System.out.println(peps.get(i));
        }
    }
}

class People
{
       private int id;
       private String info;
       private double price;

       public People()
       {

       }

       public People(int newid, String newinfo, double newprice) {
           setid(newid);
           setinfo(newinfo);
           setprice(newprice);
       }

       public int getid() {
           return id;
       }

       public void setid(int id) {
           this.id = id;
       }

       public String getinfo() {
           return info;
       }

       public void setinfo(String info) {
           this.info = info;
       }

       public double getprice() {
           return price;
       }

       public void setprice(double price) {
           this.price = price;
       }

       class ComparatorId implements Comparator<People>
       {

        @Override
        public int compare(People obj1, People obj2) {
               Integer p1 = obj1.getid();
               Integer p2 = obj2.getid();

               if (p1 > p2) {
                   return 1;
               } else if (p1 < p2){
                   return -1;
               } else {
                   return 0;
               }
            }
       }
    }

यह काम करेगा, लेकिन एक बुरा पैटर्न है। एक वर्ग का अपना 'तुलनित्र' नहीं होना चाहिए।
ग्लोरफाइंडेल

0

यहाँ एक साधारण तुलनित्र उपकरण के लिए मेरा जवाब है

public class Comparator {
public boolean isComparatorRunning  = false;
public void compareTableColumns(List<String> tableNames) {
    if(!isComparatorRunning) {
        isComparatorRunning = true;
        try {
            for (String schTableName : tableNames) {
                Map<String, String> schemaTableMap = ComparatorUtil.getSchemaTableMap(schTableName); 
                Map<String, ColumnInfo> primaryColMap = ComparatorUtil.getColumnMetadataMap(DbConnectionRepository.getConnectionOne(), schemaTableMap);
                Map<String, ColumnInfo> secondaryColMap = ComparatorUtil.getColumnMetadataMap(DbConnectionRepository.getConnectionTwo(), schemaTableMap);
                ComparatorUtil.publishColumnInfoOutput("Comparing table : "+ schemaTableMap.get(CompConstants.TABLE_NAME));
                compareColumns(primaryColMap, secondaryColMap);
            }
        } catch (Exception e) {
            ComparatorUtil.publishColumnInfoOutput("ERROR"+e.getMessage());
        }
        isComparatorRunning = false;
    }
}

public void compareColumns(Map<String, ColumnInfo> primaryColMap, Map<String, ColumnInfo> secondaryColMap) {
    try {
        boolean isEqual = true;
        for(Map.Entry<String, ColumnInfo> entry : primaryColMap.entrySet()) {
            String columnName = entry.getKey();
            ColumnInfo primaryColInfo = entry.getValue();
            ColumnInfo secondaryColInfo = secondaryColMap.remove(columnName);
            if(secondaryColInfo == null) {
                // column is not present in Secondary Environment
                ComparatorUtil.publishColumnInfoOutput("ALTER", primaryColInfo);
                isEqual = false;
                continue;
            }
            if(!primaryColInfo.equals(secondaryColInfo)) {
                isEqual = false;
                // Column not equal in secondary env
                ComparatorUtil.publishColumnInfoOutput("MODIFY", primaryColInfo);
            }
        }
        if(!secondaryColMap.isEmpty()) {
            isEqual = false;
            for(Map.Entry<String, ColumnInfo> entry : secondaryColMap.entrySet()) {
                // column is not present in Primary Environment
                ComparatorUtil.publishColumnInfoOutput("DROP", entry.getValue());
            }
        }

        if(isEqual) {
            ComparatorUtil.publishColumnInfoOutput("--Exact Match");
        }
    } catch (Exception e) {
        ComparatorUtil.publishColumnInfoOutput("ERROR"+e.getMessage());
    }
}

public void compareTableColumnsValues(String primaryTableName, String primaryColumnNames, String primaryCondition, String primaryKeyColumn, 
        String secTableName, String secColumnNames, String secCondition, String secKeyColumn) {
    if(!isComparatorRunning) {
        isComparatorRunning = true;
        Connection conn1 = DbConnectionRepository.getConnectionOne();
        Connection conn2 = DbConnectionRepository.getConnectionTwo();

        String query1 = buildQuery(primaryTableName, primaryColumnNames, primaryCondition, primaryKeyColumn);
        String query2 = buildQuery(secTableName, secColumnNames, secCondition, secKeyColumn);
        try {
            Map<String,Map<String, Object>> query1Data = executeAndRefactorData(conn1, query1, primaryKeyColumn);
            Map<String,Map<String, Object>> query2Data = executeAndRefactorData(conn2, query2, secKeyColumn);

            for(Map.Entry<String,Map<String, Object>> entry : query1Data.entrySet()) {
                String key = entry.getKey();
                Map<String, Object> value = entry.getValue();
                Map<String, Object> secondaryValue = query2Data.remove(key);
                if(secondaryValue == null) {
                    ComparatorUtil.publishColumnValuesInfoOutput("NO SUCH VALUE AVAILABLE IN SECONDARY DB "+ value.toString());
                    continue;
                }
                compareMap(value, secondaryValue, key);
            }

            if(!query2Data.isEmpty()) {
                ComparatorUtil.publishColumnValuesInfoOutput("Extra Values in Secondary table "+ ((Map)query2Data.values()).values().toString());
            }
        } catch (Exception e) {
            ComparatorUtil.publishColumnValuesInfoOutput("ERROR"+e.getMessage());
        }
        isComparatorRunning = false;
    }
}

private void compareMap(Map<String, Object> primaryValues, Map<String, Object> secondaryValues, String columnIdentification) {
    for(Map.Entry<String, Object> entry : primaryValues.entrySet()) {
        String key = entry.getKey();
        Object value = entry.getValue();
        Object secValue = secondaryValues.get(key);
        if(value!=null && secValue!=null && !String.valueOf(value).equalsIgnoreCase(String.valueOf(secValue))) {
            ComparatorUtil.publishColumnValuesInfoOutput(columnIdentification+" : Secondary Table does not match value ("+ value +") for column ("+ key+")");
        }
        if(value==null && secValue!=null) {
            ComparatorUtil.publishColumnValuesInfoOutput(columnIdentification+" : Values not available in primary table for column "+ key);
        }
        if(value!=null && secValue==null) {
            ComparatorUtil.publishColumnValuesInfoOutput(columnIdentification+" : Values not available in Secondary table for column "+ key);
        }
    }
}

private String buildQuery(String tableName, String column, String condition, String keyCol) {
    if(!"*".equalsIgnoreCase(column)) {
        String[] keyColArr = keyCol.split(",");
        for(String key: keyColArr) {
            if(!column.contains(key.trim())) {
                column+=","+key.trim();
            }
        }
    }
    StringBuilder queryBuilder = new StringBuilder();
    queryBuilder.append("select "+column+" from "+ tableName);
    if(!ComparatorUtil.isNullorEmpty(condition)) {
        queryBuilder.append(" where 1=1 and "+condition);
    }
    return queryBuilder.toString();
}

private Map<String,Map<String, Object>> executeAndRefactorData(Connection connection, String query, String keyColumn) {
    Map<String,Map<String, Object>> result = new HashMap<String, Map<String,Object>>();
    try {
        PreparedStatement preparedStatement = connection.prepareStatement(query);
        ResultSet resultSet = preparedStatement.executeQuery();
        resultSet.setFetchSize(1000);
        if (resultSet != null && !resultSet.isClosed()) {
            while (resultSet.next()) {
                Map<String, Object> columnValueDetails = new HashMap<String, Object>();
                int columnCount = resultSet.getMetaData().getColumnCount();
                for (int i=1; i<=columnCount; i++) {
                    String columnName = String.valueOf(resultSet.getMetaData().getColumnName(i));
                    Object columnValue = resultSet.getObject(columnName);
                    columnValueDetails.put(columnName, columnValue);
                }
                String[] keys = keyColumn.split(",");
                String newKey = "";
                for(int j=0; j<keys.length; j++) {
                    newKey += String.valueOf(columnValueDetails.get(keys[j]));
                }
                result.put(newKey , columnValueDetails);
            }
        }

    } catch (SQLException e) {
        ComparatorUtil.publishColumnValuesInfoOutput("ERROR"+e.getMessage());
    }
    return result;
}

}

उसी के लिए उपयोगिता उपकरण

public class ComparatorUtil {

public static Map<String, String> getSchemaTableMap(String tableNameWithSchema) {
    if(isNullorEmpty(tableNameWithSchema)) {
        return null;
    }
    Map<String, String> result = new LinkedHashMap<>();
    int index = tableNameWithSchema.indexOf(".");
    String schemaName = tableNameWithSchema.substring(0, index);
    String tableName = tableNameWithSchema.substring(index+1);
    result.put(CompConstants.SCHEMA_NAME, schemaName);
    result.put(CompConstants.TABLE_NAME, tableName);
    return result;
}

public static Map<String, ColumnInfo> getColumnMetadataMap(Connection conn, Map<String, String> schemaTableMap) {
    try {
        String schemaName = schemaTableMap.get(CompConstants.SCHEMA_NAME);
        String tableName = schemaTableMap.get(CompConstants.TABLE_NAME);
        ResultSet resultSetConnOne = conn.getMetaData().getColumns(null, schemaName, tableName, null);
        Map<String, ColumnInfo> resultSetTwoColInfo = getColumnInfo(schemaName, tableName, resultSetConnOne);
        return resultSetTwoColInfo;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

/* Number Type mapping
 * 12-----VARCHAR
 * 3-----DECIMAL
 * 93-----TIMESTAMP
 * 1111-----OTHER
*/
public static Map<String, ColumnInfo> getColumnInfo(String schemaName, String tableName, ResultSet columns) {
    try {
        Map<String, ColumnInfo> tableColumnInfo = new LinkedHashMap<String, ColumnInfo>();
        while (columns.next()) {
            ColumnInfo columnInfo = new ColumnInfo();
            columnInfo.setSchemaName(schemaName);
            columnInfo.setTableName(tableName);
            columnInfo.setColumnName(columns.getString("COLUMN_NAME"));
            columnInfo.setDatatype(columns.getString("DATA_TYPE"));
            columnInfo.setColumnsize(columns.getString("COLUMN_SIZE"));
            columnInfo.setDecimaldigits(columns.getString("DECIMAL_DIGITS"));
            columnInfo.setIsNullable(columns.getString("IS_NULLABLE"));
            tableColumnInfo.put(columnInfo.getColumnName(), columnInfo);
        }
        return tableColumnInfo;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static boolean isNullOrEmpty(Object obj) {
    if (obj == null)
        return true;
    if (String.valueOf(obj).equalsIgnoreCase("NULL")) 
        return true;
    if (obj.toString().trim().length() == 0)
        return true;
    return false;
}



public static boolean isNullorEmpty(String str) {
    if(str == null)
        return true;
    if(str.trim().length() == 0) 
        return true;
    return false;
}

public static void publishColumnInfoOutput(String type, ColumnInfo columnInfo) {
    String str = "ALTER TABLE "+columnInfo.getSchemaName()+"."+columnInfo.getTableName();
    switch(type.toUpperCase()) {
        case "ALTER":
            if("NUMBER".equalsIgnoreCase(columnInfo.getDatatype()) || "DATE".equalsIgnoreCase(columnInfo.getDatatype())) {
                str += " ADD ("+columnInfo.getColumnName()+" "+ columnInfo.getDatatype()+");";
            } else {
                str += " ADD ("+columnInfo.getColumnName()+" "+ columnInfo.getDatatype() +"("+columnInfo.getColumnsize()+"));";
            }
            break;
        case "DROP":
            str += " DROP ("+columnInfo.getColumnName()+");";
            break;
        case "MODIFY":
            if("NUMBER".equalsIgnoreCase(columnInfo.getDatatype()) || "DATE".equalsIgnoreCase(columnInfo.getDatatype())) {
                str += " MODIFY ("+columnInfo.getColumnName()+" "+ columnInfo.getDatatype()+");";
            } else {
                str += " MODIFY ("+columnInfo.getColumnName()+" "+ columnInfo.getDatatype() +"("+columnInfo.getColumnsize()+"));";
            }
            break;
    }
    publishColumnInfoOutput(str);
}

public static Map<Integer, String> allJdbcTypeName = null;

public static Map<Integer, String> getAllJdbcTypeNames() {
    Map<Integer, String> result = new HashMap<Integer, String>();
    if(allJdbcTypeName != null)
        return allJdbcTypeName;
    try {
        for (Field field : java.sql.Types.class.getFields()) {
            result.put((Integer) field.get(null), field.getName());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return allJdbcTypeName=result;
}

public static String getStringPlaces(String[] attribs) {
    String params = "";
    for(int i=0; i<attribs.length; i++) { params += "?,"; }
    return params.substring(0, params.length()-1);
}

}

स्तंभ जानकारी वर्ग

public class ColumnInfo {
private String schemaName;
private String tableName;
private String columnName;
private String datatype;
private String columnsize;
private String decimaldigits;
private String isNullable;

0

दो सुधार:

  1. आप एक करना है ArrayListकी Peopleवस्तुओं:

    ArrayList<People> preps = new ArrayList<People>(); 
  2. ऑब्जेक्ट्स को preps में जोड़ने के बाद, उपयोग करें:

    Collections.sort(preps, new CompareId());

इसके अलावा, एक CompareIdवर्ग जोड़ें :

class CompareId implements Comparator {  
    public int compare(Object obj1, Object obj2) {  
        People t1 = (People)obj1;  
        People t2 = (People)obj2;  

        if (t1.marks > t2.marks)  
            return 1;   
        else  
            return -1;
    }  
}

-7

अपने आप से सॉर्टिंग एल्गोरिदम को लागू करने में समय बर्बाद न करें। बजाय; उपयोग

डेटा को सॉर्ट करने के लिए Collection.sort ()।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.