Heim >Java >javaLernprogramm >So simulieren Sie die Rang-/Überfunktion in Java, um ein Gruppenranking zu erhalten

So simulieren Sie die Rang-/Überfunktion in Java, um ein Gruppenranking zu erhalten

WBOY
WBOYnach vorne
2023-05-03 13:52:061677Durchsuche

Hintergrund

# 🎜🎜#中文202302三级一级张小明202302 136 .00# 🎜🎜#三级二级# 🎜🎜#129,00 # 🎜🎜# 马公成# 🎜🎜#130,00#🎜 🎜## 🎜🎜 #202302三级二级伟 Pianpian 136,00# 🎜🎜# Angenommen, wir haben die oben genannten Daten und müssen nun die Rangfolge der einzelnen Chinesisch-Fachergebnisse jedes Schülers in der Klasse und die Rangfolge des gesamten Jahres zählen . Wie werden Sie es umsetzen? Es fällt uns leicht, uns die Implementierung von rank() over() vorzustellenover() ist eine analytische Funktion, die mit rank(), dense_rank(), row_number() verwenden. Die Verwendungssyntax lautet wie folgt:
RANK() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
dense_rank() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
Erläuterung: Partition nach wird zum Gruppieren des Ergebnissatzes verwendet. Wenn nicht angegeben, wird der gesamte Ergebnissatz als Gruppe behandelt. rank()-Funktion wird hauptsächlich zum Sortieren verwendet und gibt eine Sequenznummer für die sortierten und parallelen Daten sowie die Rangfolge der Parallelen an ist gelöscht. dense_rank() hat die gleiche Funktion wie rank(), der Unterschied besteht darin, dass die Rangfolge des Unentschiedens nicht geräumt wird #🎜 🎜##🎜 Die Funktion 🎜#row_number() wird der Reihe nach verwendet, unabhängig von der Parallelität
Prüfungsstapel Klasse Name
#🎜🎜 # 130,00
三级一级 王二小#🎜 🎜# 202302
Feng Shijie 202302 三级二级

rank Das Ergebnis ist 1,2,2,4 dichter_rank Das Ergebnis ist 1,2,2,3 row_number Das Ergebnis ist 1,2,3,4

In tatsächlichen Anwendungen wird auf Daten von anderen externen Systemen und in der Menge zugegriffen Die Anzahl der Daten ist nicht groß. In diesem Fall ist es bequemer, Java-Code zum Implementieren der Gruppenrankingfunktion zu verwenden.

Detailliertes Design und Implementierung

    Orderdefinitionsklasse OrderBy
  • public class OrderBy {
        private String orderByEL;
        /**
         * 是否升序
         */
        private boolean ascend;
    
        public OrderBy(){
            //默认升序
            this.ascend = true;
        }
    
        public String orderByEL(){
            return this.orderByEL;
        }
    
        public OrderBy orderByEL(String orderByEL){
            this.orderByEL = orderByEL;
            return this;
        }
    
        public OrderBy ascend(boolean ascend){
            this.ascend = ascend;
            return this;
        }
    
        public boolean ascend(){
            return this.ascend;
        }
    }

    Diese Klasse definiert die folgenden Attribute:

  • #🎜 🎜#
  • Sortierte Dateild

  • Ob es in aufsteigender Reihenfolge ist

Ranking-Methode abrufen# 🎜🎜#
Die Methode ist wie folgt definiert:

<T> void rankOver(List<T> dataList, String[] partitionByFields, List<OrderBy> orderByList, String resultField, int rankType);

Diese Methode stellt 5 Eingabeparameter bereit:

dataList sortierter Datensatz

partitionByFields Gruppierung Array von Feldern

orderByList Sortierfeldsammlung

resultField Feld, in dem Ranking-Ergebnisse gespeichert werden

    rankType Ranking-Methode
  • #🎜🎜 ##🎜 🎜#

    1: Berücksichtigen Sie nicht den Gleichstand (das Ergebnis der Zeilennummer ist 1,2,3,4)

  • 2: Berücksichtigen Sie den Gleichstand und lassen Sie den Platz weg, der durch die Rangliste mit Gleichstand eingenommen wird (Rangergebnis ist 1,2,2,4). ties (dense_rank 1,2,2, 3)

Die spezifische Implementierung dieser Methode ist wie folgt

    public static <T> void rankOver(List<T> dataList, String[] partitionByFields, List<OrderBy> orderByList, String resultField, int rankType) {
        if (CollectionUtils.isEmpty(orderByList)) {
            return;
        }
        //STEP_01 剔除掉不参与排名的数据
        List<T> tempList = new ArrayList<>();
        for (T data : dataList) {
            boolean part = true;
            for (OrderBy rptOrderBy : orderByList) {
                Object o1 = executeSpEL(rptOrderBy.orderByEL(), data);
                if (o1 == null) {
                    //参与排序的值为null的话则不参与排名
                    part = false;
                    break;
                }
            }
            if (part) {
                tempList.add(data);
            }
        }
        if (CollectionUtils.isEmpty(tempList)) {
            return;
        }
        //STEP_02 分组
        Map<String, List<T>> groupMap = group(tempList, null, partitionByFields);
        for (List<T> groupDataList : groupMap.values()) {
            order(orderByList, groupDataList);
            if (rankType == 1) {
                int rank = 1;
                for (T temp : groupDataList) {
                    setFieldValue(temp, resultField, rank);
                    rank++;
                }
            } else {
                int prevRank = Integer.MIN_VALUE;
                int size = groupDataList.size();
                for (int i = 0; i < size; i++) {
                    T current = groupDataList.get(i);
                    if (i == 0) {
                        //第一名
                        setFieldValue(current, resultField, 1);
                        prevRank = 1;
                    } else {
                        T prev = groupDataList.get(i - 1);
                        boolean sameRankWithPrev = true;//并列排名
                        for (OrderBy rptOrderBy : orderByList) {
                            Object o1 = executeSpEL(rptOrderBy.orderByEL(), current);
                            Object o2 = executeSpEL(rptOrderBy.orderByEL(), prev);
                            if (!o1.equals(o2)) {
                                sameRankWithPrev = false;
                                break;
                            }
                        }
                        if (sameRankWithPrev) {
                            setFieldValue(current, resultField, getFieldValue(prev, resultField));
                            if (rankType == 2) {
                                ++prevRank;
                            }
                        } else {
                            setFieldValue(current, resultField, ++prevRank);
                        }
                    }
                }
            }
        }
    }

Anwendungsfall #🎜🎜 #

Definieren Sie eine Schülerklasse: #🎜🎜 #
public class Student {
    private String batch;
    private String banji;
    private String name;
    private Double yuwen;
    //extra
    private Integer rank1;
    private Integer rank2;
    
    public Student(String batch, String banji, String name, Double yuwen) {
        this.batch = batch;
        this.banji = banji;
        this.name = name;
        this.yuwen = yuwen;
    }
}

Wir schreiben eine Methode, die die folgenden Daten zurückgibt:

public List<Student> getDataList() {
    List<Student> dataList = new ArrayList<>();
    dataList.add(new Student("202302", "三年一班", "张小明", 130.0));
    dataList.add(new Student("202302", "三年一班", "王二小", 128.0));
    dataList.add(new Student("202302", "三年一班", "谢春花", 136.0));
    dataList.add(new Student("202302", "三年二班", "冯世杰", 129.0));
    dataList.add(new Student("202302", "三年二班", "马功成", 130.0));
    dataList.add(new Student("202302", "三年二班", "魏翩翩", 136.0));
    return dataList;
}

Rufen Sie die Klassen- und Jahresrangliste der chinesischen Ergebnisse der Schüler ab . Die Rangliste ist unentschieden und die gleichen Plätze sind frei. Die Ergebnisse lauten wie folgt: Klasse: Klasse 3, Schüler: Zhang Xiaoming, Chinesisch-Punktzahl: 130,0, Klassenrang: 2, Gesamtwertung der Schule: 3

, Klasse: Klasse 1, Klasse 3, Schüler: Wang Er Xiao, Chinesisch-Punktzahl: 128,0, Klassenrang: 3, Gesamtwertung der Schule: 6

Klasse: 3 Schüler der 1. Klasse: Xie Chunhua Chinesisch-Wertung: 136,0 Klassenrang: 1 Schulrang: 1

Klasse: Schüler der 2. Klasse: Feng Shijie Chinesisch-Wertung: 129,0 Klassenrang: 3 Schulrang: 5

Klasse: Schüler der 2. Klasse in der 3. Klasse: Ma Gongcheng Chinesisch-Sprachergebnis: 130,0 Klassenranking: 2 Schulranking: 3

Klasse: Schüler der 2. Klasse in der 3. Klasse: Wei Pianpian Chinesisch-Sprachergebnis: 136,0 Klassenranking : 1 Schulranking: 1

# 🎜🎜#

Sie können sehen, dass in der Schulranking zwei gleichauf auf dem ersten Platz und zwei auf dem dritten Platz liegen und die Plätze 2 und 4 gleichauf sind#🎜 🎜# sind frei.

Das obige ist der detaillierte Inhalt vonSo simulieren Sie die Rang-/Überfunktion in Java, um ein Gruppenranking zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen