Heim >Java >javaLernprogramm >So simulieren Sie die Rang-/Überfunktion in Java, um ein Gruppenranking zu erhalten
Prüfungsstapel | Klasse | Name | # 🎜🎜#中文|
---|---|---|---|
三级一级 | 张小明 | #🎜🎜 # 130,00 | |
三级一级 | 王二小#🎜 🎜# | 136 .00# 🎜🎜#202302 | |
Feng Shijie | # 🎜🎜#129,00 # 🎜🎜#202302 | 三级二级 | |
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() vorzustellen | over() ist eine analytische Funktion, die mit rank(), dense_rank(), row_number() verwenden. | Die Verwendungssyntax lautet wie folgt: |
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 |
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
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:
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
resultField Feld, in dem Ranking-Ergebnisse gespeichert werden
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)
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: 6Klasse: 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: 5Klasse: 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!