Cách sử dụng Trình so sánh trong Java để sắp xếp


169

Tôi đã học cách sử dụng so sánh nhưng tôi gặp khó khăn với Trình so sánh. Tôi đang gặp lỗi trong mã của mình:

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)

Đây là mã của tôi:

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

Tôi tin rằng nó phải làm một cái gì đó với việc đúc trong phương pháp so sánh nhưng tôi đã chơi xung quanh với nó và vẫn không thể tìm ra giải pháp



1
Không sử dụng các loại thô trong mã stackoverflow.com/questions/2770321/ cấp ; sử dụng Comparator<People>, Comparable<People>, List<People>vv
polygenelubricants

Tôi đã thay đổi Trình so sánh <People> nhưng khi tôi thay đổi Arraylist <People>, Collections.sort gặp lỗi
Dan

1
đọc câu trả lời của tôi về 2 quá tải của sort. Nếu bạn được yêu cầu sử dụng Comparator<People>, thì hãy sử dụng đối số 2 sort, không phải đối số 1 sort(yêu cầu People implements Comparable<People>).
đa gen

Câu trả lời:


212

Có một vài điều khó xử với lớp mẫu của bạn:

  • nó được gọi là People trong khi nó có một priceinfo(nhiều thứ hơn cho các đối tượng, không phải con người);
  • khi đặt tên một lớp là số nhiều của một cái gì đó, nó gợi ý rằng nó là một sự trừu tượng của nhiều thứ.

Dù sao, đây là bản demo về cách sử dụng 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);
    }
}

BIÊN TẬP

Và một bản demo Java 8 tương đương sẽ như thế này:

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
AgeComparator và các phép so sánh tương tự của các số nguyên có thể được đơn giản hóa để quay trở lạia.age - b.age
Esko Luontola

13
@Esko: "mẹo" so sánh bằng phép trừ bị phá vỡ đối với int stackoverflow.com/questions/2728793/iêu
polygenelubricants

1
@Esko: vì những gì đa gen đã đề cập, tôi chỉ đơn giản là luôn làm như vậy, mặc dù trong một thời đại (sẽ không trở nên rất lớn), phép trừ như bạn đề cập sẽ làm.
Bart Kiers

3
@saikiran, bạn có thể. Nhưng khi thực hiện Comparable, bạn phải chọn một thuộc tính duy nhất để so sánh với. Trong trường hợp của một người, có nhiều thuộc tính người ta có thể so sánh về: tuổi, chiều dài, giới tính, tên, v.v. Trong trường hợp đó, thật dễ dàng để cung cấp một vài so sánh thực hiện các so sánh này.
Bart Kiers

1
@forsberg không, nó không bắt buộc, nhưng (rất được khuyến khích). Xem: stackoverflow.com/questions/94361/ từ
Bart Kiers

161

Đây là một mẫu siêu ngắn để thực hiện sắp xếp ngay lập tức:

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

nếu khó nhớ, hãy cố gắng chỉ nhớ rằng nó tương tự (về dấu hiệu của số) với:

 lhs-rhs 

Đó là trong trường hợp bạn muốn sắp xếp theo thứ tự tăng dần: từ số nhỏ nhất đến số lớn nhất.


3
@ 40Plot, đó là để định vị, hình ảnh một thước kẻ hoặc trục với chúng.
Eugene

Nhà phát triển @android, Cảm ơn bạn đã đề cập đến mẹo để nhớ giá trị nào sẽ trả về cho đơn hàng nào. :)
Gaur93

Giải thích tốt nhất từ compare()trước đến nay.
Muhammad Babar

cũng nhập java.util.Comparator
Viraj Singh

@VirajSingh Câu hỏi là về lớp học này, vì vậy tất nhiên đó là câu hỏi mà tôi đang nói đến ...
nhà phát triển Android

39

Sử dụng People implements Comparable<People>thay thế; điều này xác định thứ tự tự nhiên cho People.

A Comparator<People>cũng có thể được định nghĩa thêm, nhưng People implements Comparator<People>không phải là cách làm đúng.

Hai quá tải cho Collections.sortkhác nhau:

  • <T extends Comparable<? super T>> void sort(List<T> list)
    • Sắp xếp Comparablecác đối tượng bằng cách sử dụng thứ tự tự nhiên của chúng
  • <T> void sort(List<T> list, Comparator<? super T> c)
    • Sắp xếp mọi thứ bằng cách sử dụng tương thích Comparator

Bạn đang nhầm lẫn giữa hai người bằng cách cố gắng sắp xếp một Comparator(đó là lý do tại sao nó không có ý nghĩa đó Person implements Comparator<Person>). Một lần nữa, để sử dụng Collections.sort, bạn cần một trong những điều này là đúng:

  • Loại phải là Comparable(sử dụng 1-arg sort)
  • A Comparatorcho loại phải được cung cấp (sử dụng 2-args sort)

Câu hỏi liên quan


Ngoài ra, không sử dụng các loại thô trong mã mới . Các loại nguyên liệu không an toàn và nó chỉ được cung cấp để tương thích.

Đó là, thay vì điều này:

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

bạn nên sử dụng khai báo chung loại an toàn như thế này:

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

Sau đó, bạn sẽ thấy rằng mã của bạn thậm chí không biên dịch !! Đó sẽ là một điều tốt, bởi vì có một cái gì đó sai với mã ( Personkhông implements Comparable<Person>), nhưng vì bạn đã sử dụng loại thô, trình biên dịch đã không kiểm tra điều này , và thay vào đó bạn nhận được một ClassCastExceptionthời gian chạy !!!

Điều này sẽ thuyết phục bạn luôn sử dụng các loại chung chung an toàn trong mã mới. Luôn luôn.

Xem thêm


lời giải thích của so sánh và so sánh là rất hữu ích
abdel

18

Để hoàn thiện, đây là một comparephương pháp đơn giản :

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

2
Đánh giá cao khi sử dụngsignum
msysmilu

1
@NumberFour "lhs.getId () - rhs.getId ()" không nên được sử dụng, Nó có các thay đổi của tràn Integer.
niraj.nijju

Đối với chuỗi "return lhs.getName (). SoToTo (rhs.getName ());".
Ali Ahmed

1
Integer.compare(lhs.getId(), rhs.getId());là một cách tiếp cận tốt hơn. Như @ niraj.nijju đã đề cập đến phép trừ có thể gây ra tràn.
narendra-choudhary

12

Java 8 đã thêm một cách mới để tạo Trình so sánh giúp giảm số lượng mã bạn phải viết, so sánh . Ngoài ra, hãy kiểm tra so sánh.reversed

Đây là một mẫu

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

Bạn muốn thực hiện So sánh, không phải so sánh. Bạn cần thực hiện phương thức so sánh. Bạn đang ở gần So sánh là một thói quen so sánh "bên thứ 3". So sánh là đối tượng này có thể được so sánh với đối tượng khác.

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

Lưu ý, bạn có thể muốn kiểm tra null ở đây để lấy getId..chỉ trong trường hợp.


Tôi quên đề cập đến đây là bài tập về nhà, tôi được đặc biệt nói là sử dụng bộ so sánh
Dan

2

Dưới đây là ví dụ về Công cụ so sánh sẽ hoạt động cho bất kỳ phương thức zero arg nào trả về So sánh. Có một cái gì đó như thế này tồn tại trong một jdk hoặc thư viện?

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

}

Nó thực sự tuyệt vời!
Zhurov Konstantin

2

Vì lợi ích của sự trọn vẹn.

Sử dụng Java8

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

nếu bạn muốn descending order

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

Điều gì xảy ra khi có hai đối tượng trong danh sách có cùng giá trị thuộc tính được sử dụng để so sánh, trong trường hợp này là People::getId?
Kok How Te

Bạn có thể thêm một .thenComparing()mệnh đề khi có xung đột.
Ankit Sharma

Điều gì xảy ra trong kết quả nếu không có .thenComparing()?
Kok Cách

Sau đó, nó phụ thuộc vào thứ tự xuất hiện các hồ sơ, đọc thêm về geekforgeek.org/stability-in-sorting-alacticms
Ankit Sharma

Làm thế nào để tôi biết nếu thuật toán sắp xếp được sử dụng là ổn định hoặc không ổn định?
Kok How Te

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

Giải pháp có thể được tối ưu hóa theo cách sau: Thứ nhất, sử dụng lớp bên trong riêng vì phạm vi cho các trường là lớp TestP People kèm theo để việc triển khai lớp Mọi người sẽ không được tiếp xúc với thế giới bên ngoài. Điều này có thể được hiểu theo nghĩa là tạo APIthat mong đợi một danh sách người được sắp xếp Thứ hai, sử dụng biểu thức Lamba (java 8) làm giảm mã, do đó nỗ lực phát triển

Do đó mã sẽ như sau:

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

Bạn nên sử dụng phương thức sắp xếp quá tải (peps, new People ())

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

Điều này sẽ làm việc, nhưng là một mô hình xấu. Một lớp không nên là 'Bộ so sánh' của riêng nó.
Glorfindel

0

Đây là câu trả lời của tôi cho một công cụ so sánh đơn giản

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

}

Công cụ tiện ích cho cùng

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

}

Cột thông tin lớp

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

Hai điều chỉnh:

  1. Bạn cần phải thực hiện một ArrayListtrong Peoplecác đối tượng:

    ArrayList<People> preps = new ArrayList<People>(); 
  2. Sau khi thêm các đối tượng vào giao diện, sử dụng:

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

Ngoài ra, thêm một CompareIdlớp như:

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

Đừng lãng phí thời gian để thực hiện Thuật toán sắp xếp theo cách riêng của bạn. Thay thế; sử dụng

Bộ sưu tập.sort () để sắp xếp dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.