Cara menggunakan pembanding di Jawa untuk mengurutkan

169

Saya belajar cara menggunakan yang sebanding tetapi saya mengalami kesulitan dengan Pembanding. Saya mengalami kesalahan dalam kode saya:

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)

Ini kode saya:

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));
        }
    }
}

Saya percaya itu harus melakukan sesuatu dengan casting dalam metode bandingkan tetapi saya bermain-main dengan itu dan masih tidak dapat menemukan solusinya

Dan
sumber
1
Jangan gunakan tipe mentah dalam kode stackoverflow.com/questions/2770321/… baru ; penggunaan Comparator<People>, Comparable<People>, List<People>, dll
polygenelubricants
Saya mengubah Pembanding <Orang> tetapi ketika saya mengubah Arraylist <Orang>, Collections.sort mendapat kesalahan
Dan
1
baca jawaban saya tentang 2 kelebihan sort. Jika Anda disuruh menggunakan Comparator<People>, maka gunakan argumen 2 sort, bukan argumen 1 sort(yang mengharuskan People implements Comparable<People>).
polygenelubricants

Jawaban:

212

Ada beberapa hal yang aneh dengan kelas contoh Anda:

  • itu disebut People sementara ia memiliki pricedan info(lebih banyak sesuatu untuk objek, bukan orang);
  • ketika menyebut kelas sebagai bentuk jamak dari sesuatu, ini menunjukkan bahwa itu adalah abstraksi lebih dari satu hal.

Bagaimanapun, ini adalah demo cara menggunakan 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);
    }
}

EDIT

Dan demo Java 8 yang setara akan terlihat seperti ini:

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);
    }
}
Bart Kiers
sumber
8
The AgeComparator dan perbandingan bilangan bulat yang serupa dapat disederhanakan untuk dikembalikana.age - b.age
Esko Luontola
13
@Esko: perbandingan "dengan" pengurangan "trik" rusak untuk int stackoverflow.com/questions/2728793/…
polygenelubricants
1
@ Esko: karena apa yang disebutkan polygenelubricants, saya hanya selalu melakukannya seperti itu, meskipun untuk usia (yang tidak akan menjadi sangat besar) pengurangan seperti yang Anda sebutkan akan lakukan.
Bart Kiers
3
@ Safiran, Anda bisa. Tetapi ketika menerapkan Comparable, Anda harus memilih satu atribut untuk dibandingkan. Dalam hal seseorang, ada banyak atribut yang dapat dibandingkan: umur, panjang, jenis kelamin, nama, dll. Dalam hal ini, mudah untuk menyediakan beberapa pembanding yang melakukan perbandingan ini.
Bart Kiers
1
@forsberg tidak, itu tidak wajib, tetapi (sangat) disarankan. Lihat: stackoverflow.com/questions/94361/…
Bart Kiers
162

Berikut ini adalah templat super pendek untuk segera disortir:

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)
     }
 });

jika sulit untuk diingat, cobalah untuk hanya mengingat bahwa itu mirip (dalam hal tanda nomor) dengan:

 lhs-rhs 

Itu kalau-kalau Anda ingin mengurutkan dalam urutan naik: dari jumlah terkecil ke jumlah terbesar.

pengembang android
sumber
3
@ 40Plot, itu untuk penentuan posisi, gambar penggaris atau sumbu dengan mereka.
Eugene
@dan pengembang, Terima kasih telah menyebutkan trik untuk mengingat nilai yang harus dikembalikan untuk pesanan yang mana. :)
Gaur93
Penjelasan terbaik dari yang compare()pernah ada.
Muhammad Babar
juga mengimpor java.util.Comparator
Viraj Singh
@VirajSingh Pertanyaannya adalah tentang kelas ini, jadi tentu saja ini yang saya bicarakan ...
pengembang android
39

Gunakan People implements Comparable<People>sebaliknya; ini mendefinisikan pemesanan alami untuk People.

A Comparator<People>juga dapat didefinisikan sebagai tambahan, tetapi People implements Comparator<People>bukan cara yang tepat dalam melakukan sesuatu.

Dua kelebihan untuk Collections.sortberbeda:

  • <T extends Comparable<? super T>> void sort(List<T> list)
    • Mengurutkan Comparableobjek menggunakan pemesanan alami mereka
  • <T> void sort(List<T> list, Comparator<? super T> c)
    • Mengurutkan apa pun yang menggunakan yang kompatibel Comparator

Anda membingungkan keduanya dengan mencoba mengurutkan Comparator(yang lagi mengapa itu tidak masuk akal Person implements Comparator<Person>). Sekali lagi, untuk menggunakannya Collections.sort, Anda perlu salah satunya:

  • Jenisnya harus Comparable(gunakan 1-arg sort)
  • A Comparatoruntuk tipe harus disediakan (gunakan 2-args sort)

Pertanyaan-pertanyaan Terkait


Juga, jangan gunakan tipe mentah dalam kode baru . Jenis mentah tidak aman, dan disediakan hanya untuk kompatibilitas.

Itu, bukannya ini:

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

Anda harus menggunakan deklarasi generik typesafe seperti ini:

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

Anda kemudian akan menemukan bahwa kode Anda bahkan tidak dapat dikompilasi !! Itu akan menjadi hal yang baik, karena ada sesuatu yang salah dengan kode ( Persontidak implements Comparable<Person>), tetapi karena Anda menggunakan tipe mentah, kompiler tidak memeriksa ini , dan sebaliknya Anda mendapatkanClassCastException pada saat run-time !!!

Ini harus meyakinkan Anda untuk selalu menggunakan jenis generik typesafe dalam kode baru. Selalu.

Lihat juga

polygenelubricants
sumber
penjelasan tentang pembanding vs pembanding sangat berguna
abdel
18

Demi kelengkapan, berikut adalah metode satu garis sederhana compare:

Collections.sort(people, new Comparator<Person>() {
    @Override
    public int compare(Person lhs, Person rhs) {  
        return Integer.signum(lhs.getId() - rhs.getId());  
    }
});
Nomor empat
sumber
2
Dihargai karena menggunakansignum
msysmilu
1
@NumberFour "lhs.getId () - rhs.getId ()" tidak boleh digunakan, ini memiliki perubahan Integer overflow.
niraj.nijju
Untuk string "return lhs.getName (). CompareTo (rhs.getName ());".
Ali Ahmed
1
Integer.compare(lhs.getId(), rhs.getId());adalah pendekatan yang lebih baik. Seperti @ niraj.nijju disebutkan pengurangan dapat menyebabkan overflow.
narendra-choudhary
12

Java 8 menambahkan cara baru untuk membuat Komparator yang mengurangi jumlah kode yang harus Anda tulis, Comparator.comparing . Lihat juga Comparator.reversed

Ini contohnya

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;
        }
    }



}
rince
sumber
4

Anda ingin menerapkan Sebanding, bukan Pembanding. Anda perlu menerapkan metode compareTo. Anda sudah dekat. Pembanding adalah perbandingan rutin "pihak ketiga". Sebanding dengan itu objek ini dapat dibandingkan dengan yang lain.

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;
 }

Catatan, Anda mungkin ingin memeriksa nulls di sini untuk getId..hanya dalam kasus.

Will Hartung
sumber
Saya lupa menyebutkan ini adalah pekerjaan rumah, saya secara khusus disuruh menggunakan pembanding
Dan
2

Berikut adalah contoh dari Pembanding yang akan bekerja untuk metode zero arg apa pun yang mengembalikan Sebanding. Apakah sesuatu seperti ini ada di jdk atau perpustakaan?

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);
        }
    }

}
John
sumber
Sangat bagus!
Zhurov Konstantin
2

Demi kelengkapan.

Menggunakan Java8

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

jika Anda ingin masuk descending order

people.sort(Comparator.comparingInt(People::getId).reversed());
Ankit Sharma
sumber
Apa yang terjadi ketika ada dua objek dalam daftar dengan nilai properti yang sama yang digunakan dalam perbandingan, yang, dalam hal ini, adalah People::getId?
Kok How Teh
Anda bisa menambahkan .thenComparing()klausa ketika ada bentrokan.
Ankit Sharma
Apa yang terjadi pada hasilnya jika tidak ada .thenComparing()?
Kok How Teh
Maka itu tergantung pada urutan di mana catatan itu hadir, baca lebih lanjut tentang geeksforgeeks.org/stability-in-sorting-algorithms
Ankit Sharma
Bagaimana saya tahu jika algoritma pengurutan yang digunakan stabil atau tidak stabil?
Kok How Teh
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;
            }
        };
QuadBiker
sumber
1

Solusinya dapat dioptimalkan dengan cara berikut: Pertama, menggunakan kelas dalam pribadi sebagai ruang lingkup untuk bidang adalah menjadi kelas TestPeople terlampir sehingga implementasi kelas Orang tidak akan terkena dunia luar. Ini dapat dipahami dalam hal membuat API yang mengharapkan daftar orang yang diurutkan. Kedua, menggunakan ekspresi Lamba (java 8) yang mengurangi kode, maka upaya pengembangan

Maka kode akan seperti di bawah ini:

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;
        }
    }
}
Akhil Gupta
sumber
0

Anda harus menggunakan metode sort (peps, People, (new)) yang kelebihan beban

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;
               }
            }
       }
    }
michal
sumber
Ini akan berhasil, tetapi merupakan pola yang buruk. Kelas tidak seharusnya menjadi 'Pembanding' sendiri.
Glorfindel
0

Inilah jawaban saya untuk alat pembanding sederhana

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;
}

}

Alat Utilitas untuk hal yang sama

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);
}

}

Kelas Info Kolom

public class ColumnInfo {
private String schemaName;
private String tableName;
private String columnName;
private String datatype;
private String columnsize;
private String decimaldigits;
private String isNullable;
Vrajendra Singh Mandloi
sumber
0

Dua koreksi:

  1. Anda harus membuat ArrayListdari Peopleobjek:

    ArrayList<People> preps = new ArrayList<People>(); 
  2. Setelah menambahkan objek ke prep, gunakan:

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

Juga, tambahkan CompareIdkelas sebagai:

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;
    }  
}
CoderSam
sumber
-7

Jangan buang waktu menerapkan Algoritma Penyortiran oleh Anda sendiri. Sebagai gantinya; menggunakan

Collections.sort () untuk mengurutkan data.

pooja jardosh
sumber