国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot進(jìn)階教程(七十六)多維度排序查詢

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot進(jìn)階教程(七十六)多維度排序查詢。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

在項(xiàng)目中經(jīng)常能遇到,需要對(duì)某些數(shù)據(jù)集合進(jìn)行多維度排序的需求。對(duì)于集合多條件排序解決方案也有很多,今天我們就介紹一種,思路大致是設(shè)置一個(gè)分值的集合,這個(gè)分值是按照需求來(lái)設(shè)定大小的,再根據(jù)分值的大小對(duì)集合排序。

v需求背景

我們來(lái)模擬一個(gè)需求,現(xiàn)在需要查詢一個(gè)用戶列表,該列表需要實(shí)現(xiàn)的排序優(yōu)先級(jí)如下:

  • 付費(fèi)用戶排在前,非付費(fèi)用戶排在后
  • 付費(fèi)用戶中,排序優(yōu)先級(jí):同城市的>同省的>等級(jí)高的>活躍用戶>不活躍用戶>其他用戶
  • 非付費(fèi)用戶中,排序優(yōu)先級(jí):等級(jí)高的>同城市的>其他用戶

v代碼實(shí)現(xiàn)

創(chuàng)建user類
package com.user;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

/**
 * @Author toutou
 * @Date 2023/2/18
 * @Des
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
    private Integer id;

    /**
     * 等級(jí)
     */
    private int grade;

    /**
     * 所在省份id
     */
    private int provinceId;

    /**
     * 所在城市ID
     */
    private int cityId;

    /**
     * 是否是活躍用戶,true活躍,false不活躍
     */
    private boolean lively;

    /**
     * 是否開(kāi)通支付,true開(kāi)通,false未開(kāi)通
     */
    private boolean pay;

    public static List<User> getTestUserList() {
        List<User> list = new ArrayList<>();
        list.add(User.builder().id(0).grade(1).provinceId(1).cityId(22).lively(false).pay(false).build());
        list.add(User.builder().id(1).grade(1).provinceId(1).cityId(100).lively(true).pay(true).build());
        list.add(User.builder().id(2).grade(3).provinceId(5).cityId(100).lively(true).pay(true).build());
        list.add(User.builder().id(3).grade(2).provinceId(1).cityId(98).lively(true).pay(true).build());
        list.add(User.builder().id(4).grade(2).provinceId(1).cityId(100).lively(true).pay(true).build());
        list.add(User.builder().id(5).grade(2).provinceId(3).cityId(100).lively(true).pay(true).build());
        list.add(User.builder().id(6).grade(2).provinceId(1).cityId(101).lively(true).pay(false).build());
        list.add(User.builder().id(7).grade(1).provinceId(6).cityId(100).lively(false).pay(true).build());
        list.add(User.builder().id(8).grade(1).provinceId(1).cityId(98).lively(true).pay(false).build());
        list.add(User.builder().id(9).grade(1).provinceId(5).cityId(100).lively(true).pay(true).build());
        return list;
    }
}

為了便于調(diào)試,我們?cè)趗ser類中創(chuàng)建一個(gè)測(cè)試方法getTestUserList,以此來(lái)生成測(cè)試數(shù)據(jù)。

創(chuàng)建排序幫助類
package com.util;

import java.math.BigDecimal;
import java.util.List;

/**
 * @Author toutou
 * @Date 2023/2/18
 * @Des
 */
public class SortHelper {
    /**
     * 比較兩個(gè)BigDecimal集合
     * @param left
     * @param right
     * @return leftList<rightList返回-1;leftList=rightList返回0;leftList>rightList返回1;
     */
    public static int compareBigDecimalList(List<BigDecimal> left, List<BigDecimal> right) {
        int length = Math.max(left.size(), right.size());
        for (int i = 0; i < length; i++) {
            if (left.size() < i + 1) {
                return -1;
            }
            if (right.size() < i + 1) {
                return 1;
            }

            int value = left.get(i).compareTo(right.get(i));
            if (value != 0) {
                return value;
            }
        }
        return 0;
    }
}
排序?qū)崿F(xiàn)類
package com.util;

import com.user.User;
import org.apache.commons.lang3.tuple.ImmutablePair;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import reactor.core.publisher.Flux;

/**
 * @Author toutou
 * @Date 2023/2/18
 * @Des
 */
public class Sort {
    /**
     * 當(dāng)前用戶所在城市id,所在省份id
     * @param cityId
     * @param provinceId
     * @return
     */
    public List<User> sortUserList(int cityId, int provinceId) {
        // 獲取初始化測(cè)試list數(shù)據(jù)
        List<User> list = User.getTestUserList();
        if(list == null || list.size() == 0){
            return list;
        }

        List<ImmutablePair<User, List<BigDecimal>>> userAndScore = new ArrayList<>();
        for (User user : list){
            // 初始化一個(gè)排序的分值list
            List<BigDecimal> scoreList = Flux.range(0, 6).map(p -> BigDecimal.ZERO).collectList().block();
            userAndScore.add(new ImmutablePair<>(user, scoreList));
            if(user.isPay()){
                // 付費(fèi)用戶排序,付費(fèi)用戶為1,非付費(fèi)用戶為2
                scoreList.set(0, BigDecimal.valueOf(1));

                if(user.getCityId() == cityId){
                    scoreList.set(1, BigDecimal.valueOf(1));
                }else{
                    scoreList.set(1, BigDecimal.valueOf(2));
                }

                if(user.getProvinceId() == provinceId){
                    scoreList.set(2, BigDecimal.valueOf(1));
                }else{
                    scoreList.set(2, BigDecimal.valueOf(2));
                }

                scoreList.set(3, BigDecimal.valueOf(-user.getGrade()));
                if(user.isLively()){
                    scoreList.set(4, BigDecimal.valueOf(1));
                }else{
                    scoreList.set(4, BigDecimal.valueOf(2));
                }

                scoreList.set(5, BigDecimal.valueOf(-user.getId()));
            }else{
                scoreList.set(0, BigDecimal.valueOf(2));
                scoreList.set(1, BigDecimal.valueOf(-user.getGrade()));
                if(user.getCityId() == cityId){
                    scoreList.set(2, BigDecimal.valueOf(1));
                }else{
                    scoreList.set(2, BigDecimal.valueOf(2));
                }

                scoreList.set(3, BigDecimal.valueOf(-user.getId()));
            }
        }

        return userAndScore.stream().sorted(Comparator.comparing(p -> p.getValue(), SortHelper::compareBigDecimalList)).map(ImmutablePair::getLeft).collect(Collectors.toList());
    }
}
debug效果

SpringBoot進(jìn)階教程(七十六)多維度排序查詢

v源碼地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:請(qǐng)叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關(guān)于作者:專注于基礎(chǔ)平臺(tái)的項(xiàng)目開(kāi)發(fā)。如有問(wèn)題或建議,請(qǐng)多多賜教!
版權(quán)聲明:本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接。
特此聲明:所有評(píng)論和私信都會(huì)在第一時(shí)間回復(fù)。也歡迎園子的大大們指正錯(cuò)誤,共同進(jìn)步?;蛘咧苯铀叫盼?
聲援博主:如果您覺(jué)得文章對(duì)您有幫助,可以點(diǎn)擊文章右下角【推薦】一下。您的鼓勵(lì)是作者堅(jiān)持原創(chuàng)和持續(xù)寫(xiě)作的最大動(dòng)力!
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-478259.html

到了這里,關(guān)于SpringBoot進(jìn)階教程(七十六)多維度排序查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 模板特化的多維度挖掘

    ?? 假如我有一個(gè)需求,就是如果傳入的參數(shù)是int類型,我就輸出int類型,否則就輸出T。很顯然,根據(jù)模板的基礎(chǔ)知識(shí),我們可以這么寫(xiě) ?? 除了這樣寫(xiě),還有別的寫(xiě)法嗎。我們可以思考一下.................這里我們其實(shí)可以用std::enable_if_t來(lái)實(shí)現(xiàn),它相當(dāng)于給std::enable_if的

    2024年02月08日
    瀏覽(14)
  • 橋接模式-處理多維度變化

    橋接模式-處理多維度變化

    ?程序員小名去擺攤賣奶茶了,口味有香、甜。 型號(hào)有大、中、小。假如小名先在家里把這些奶茶裝好,那么最少要裝2x3 = 6杯奶茶,如果此時(shí)新增一個(gè)口味:酸,那么就需要多裝3杯奶茶了。而且這樣做,等客戶買走一種,比如 甜+大杯后,這種型號(hào)就沒(méi)有了,這樣擴(kuò)展性不太

    2024年02月16日
    瀏覽(19)
  • 3.1 多維度隨機(jī)變量及其分布

    3.1 多維度隨機(jī)變量及其分布

    ? ? ? 要學(xué)習(xí)二維隨機(jī)變量及聯(lián)合分布,我會(huì)按照以下步驟進(jìn)行: 了解基本概念:首先要了解二維隨機(jī)變量的概念,即同時(shí)包含兩個(gè)隨機(jī)變量的變量。還要了解二維隨機(jī)變量的取值范圍以及聯(lián)合概率密度函數(shù)和聯(lián)合分布函數(shù)的定義。 學(xué)習(xí)聯(lián)合分布函數(shù)的性質(zhì):聯(lián)合分布函數(shù)

    2024年02月06日
    瀏覽(33)
  • AIGC ChatGPT 實(shí)現(xiàn)動(dòng)態(tài)多維度分析雷達(dá)圖制作

    AIGC ChatGPT 實(shí)現(xiàn)動(dòng)態(tài)多維度分析雷達(dá)圖制作

    雷達(dá)圖在多維度分析中是一種非常實(shí)用的可視化工具,主要有以下優(yōu)勢(shì): 易于理解: 雷達(dá)圖使用多邊形或者圓形的形式展示多維度的數(shù)據(jù),直觀易于理解。 多維度對(duì)比: 雷達(dá)圖可以在同一張圖上比較多個(gè)項(xiàng)目或者實(shí)體在多個(gè)維度上的表現(xiàn)。 數(shù)據(jù)關(guān)系明顯: 通過(guò)雷達(dá)圖,可

    2024年02月11日
    瀏覽(27)
  • 異構(gòu)區(qū)塊鏈的多維度安全檢測(cè)方案

    摘 要 :異構(gòu)區(qū)塊鏈多維度安全檢測(cè)方案可以為多樣化的區(qū)塊鏈平臺(tái)安全性檢測(cè)提供統(tǒng)一的測(cè)評(píng)標(biāo)準(zhǔn)和檢測(cè)方法,輔助相關(guān)部門對(duì)區(qū)塊鏈平臺(tái)進(jìn)行有效檢測(cè)和監(jiān)管,促進(jìn)區(qū)塊鏈行業(yè)的合規(guī)發(fā)展。通過(guò)分析現(xiàn)有區(qū)塊鏈安全檢測(cè)的需求,針對(duì)目前多樣性的區(qū)塊鏈底層平臺(tái),提出普

    2024年02月05日
    瀏覽(22)
  • Python多維矩陣的各個(gè)維度表示(axis = ......)

    Python多維矩陣的各個(gè)維度表示(axis = ......)

    在python中對(duì)多維矩陣進(jìn)行操作時(shí),往往要指定操作的維度,一般用0,1,-1這樣的數(shù)字表示矩陣的某一維度。二維矩陣還是好分辨數(shù)字表示的維度的,但對(duì)于三維矩陣或更高維度的矩陣就不好分辨了。這里只說(shuō)明三維矩陣的三個(gè)維度怎么分辨。 以一個(gè)三維矩陣按不同維度求和

    2024年02月13日
    瀏覽(23)
  • 多維度聊一聊 k8s 和 openstack

    多維度聊一聊 k8s 和 openstack

    k8s 和 openstack 無(wú)疑是當(dāng)今云計(jì)算領(lǐng)域的兩大巨頭,它們分別占據(jù)著 IaaS 和 PaaS 領(lǐng)域的事實(shí)標(biāo)準(zhǔn),經(jīng)常被拿來(lái)一起比較。我記得大概在三四年前 k8s 如火如荼的發(fā)展的時(shí)候,“openstack 已死”,“openstack 沒(méi)落了”之類的文章層出不窮。但是這么年過(guò)去了 openstack 老當(dāng)益壯依然在云

    2024年01月22日
    瀏覽(23)
  • 《揚(yáng)帆優(yōu)配》兩融業(yè)務(wù)不乏亮點(diǎn) 仍需多維度補(bǔ)短板

    《揚(yáng)帆優(yōu)配》兩融業(yè)務(wù)不乏亮點(diǎn) 仍需多維度補(bǔ)短板

    受多重因素影響,2022年證券職業(yè)全體成績(jī)承壓。不過(guò),到3月29日晚記者發(fā)稿時(shí),從已發(fā)表的7家上市券商2022年年報(bào)來(lái)看,券商在兩融事務(wù)方面不乏亮點(diǎn)。 ? 受訪業(yè)內(nèi)人士表明,兩融事務(wù)的開(kāi)展不僅豐厚了券商的收入,也促進(jìn)了券商其他事務(wù)的開(kāi)展??墒?,兩融事務(wù)開(kāi)展中存在

    2024年02月02日
    瀏覽(23)
  • Matlab 線性擬合、一維、多維度非線性擬合、多項(xiàng)式擬合

    Matlab 線性擬合、一維、多維度非線性擬合、多項(xiàng)式擬合

    ? 線性擬合 我隨便設(shè)定一個(gè)函數(shù)然后通過(guò)解方程計(jì)算出對(duì)應(yīng)的系數(shù) 假設(shè)我的函數(shù)原型是 y=a*sin(0.1*x.^2+x)+b* squre(x+1)+c*x+d ?擬合系數(shù): ? 利用matlab實(shí)現(xiàn)非線性擬合(三維、高維、參數(shù)方程)_matlab多元非線性擬合_hyhhyh21的博客-CSDN博客 簡(jiǎn)單的一維的擬合: 思路: 將非線性-》線

    2024年02月12日
    瀏覽(23)
  • 拋開(kāi)價(jià)格,DBeaver真的比Navicat好用嗎?多維度測(cè)評(píng)來(lái)了!??!

    今天看到一個(gè)很有意思的話題“拋開(kāi)價(jià)格,DBeaver真的比Navicat好用嗎?” ,正好自己最近使用的數(shù)據(jù)庫(kù)連接工具比較多,兩個(gè)軟件都有使用過(guò),我以自己的使用體驗(yàn)給你對(duì)比一下,從這個(gè)方面去對(duì)比: 1、下載難易 DBeaver是個(gè)開(kāi)源軟件,比較容易利用現(xiàn)有的網(wǎng)絡(luò)資源找到安裝包。

    2024年02月16日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包