記前端曲線展示小問(wèn)題解決

問(wèn)題描述:
開(kāi)發(fā)過(guò)程中隔箍,我們的前端使用Echarts.js開(kāi)發(fā)時(shí),碰到了一個(gè)困擾她的問(wèn)題脚乡。


image.png

上面的曲線的X軸為時(shí)間軸蜒滩, Y軸為數(shù)值, 問(wèn)題在當(dāng)這幾個(gè)線返回的X軸數(shù)據(jù)不一致時(shí), Echarts.js 在那個(gè)點(diǎn)會(huì)出現(xiàn)斷線帮掉。

image.png

寫(xiě)了個(gè)東西弦悉,將缺失的數(shù)據(jù)補(bǔ)全,
即X軸數(shù)據(jù)補(bǔ)全蟆炊,然后Y軸使用臨近的兩個(gè)點(diǎn)的均值補(bǔ)全稽莉;
當(dāng)前后沒(méi)有點(diǎn)時(shí),使用最近的點(diǎn)的數(shù)值進(jìn)行補(bǔ)全涩搓。

package com.loyotech.bigscreenbackend;

import com.loyotech.bigscreenbackend.dto.IceThicknessCurvesDTO;
import com.loyotech.bigscreenbackend.model.IceThicknessCurve;
import com.loyotech.bigscreenbackend.util.ObjectUtil;
import lombok.extern.java.Log;
import org.junit.Test;

import java.util.*;
import java.util.logging.Level;
import java.util.stream.Collectors;

/*
 * @program big-screen-backend
 * @description
 * @author Rudolph Browne
 * @create 19-1-15
 */
@Log
public class curveOfIceThicknessTest {

    @Test
    public void test01() {

        List<IceThicknessCurvesDTO> result = prepareTestData();

        log.log(Level.INFO, result.toString());

        initialFakePoint(result);

        log.log(Level.INFO, result.toString());

        evaluateFakePoint(result);

        log.log(Level.INFO, result.toString());

    }

    @Test
    public void test02() {
        IceThicknessCurve a = new IceThicknessCurve() {{
            setRecPhase("C相");
            setRecIceHeight("1");
            setRecBsId("CC2529");
            setCreateDate("2019-01-13 21:34:27");
            setRecUpdateTime("2019-01-13 04:10:26");
        }};

        IceThicknessCurve b = new IceThicknessCurve();

        ObjectUtil.copyProperties(IceThicknessCurve.class, a, IceThicknessCurve.class, b);

        log.log(Level.INFO, b.toString());
    }

    @Test
    public void test03() {
        List list = Arrays.asList(1,2,3,2,1,3);

        list = (List) list.stream().distinct().collect(Collectors.toList());

        log.log(Level.INFO, list.toString());
    }
}

    private List<IceThicknessCurvesDTO> prepareTestData() {
        return new LinkedList<IceThicknessCurvesDTO>() {{
            add(new IceThicknessCurvesDTO() {{
                setPhrase("A相");
                setList(new LinkedList<IceThicknessCurve>(){{
                    add(new IceThicknessCurve() {{
                        setRecPhase("A相");
                        setRecIceHeight("1");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 21:10:26");
                    }});
                    add(new IceThicknessCurve() {{
                        setRecPhase("A相");
                        setRecIceHeight("5");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 15:10:26");
                    }});
                    add(new IceThicknessCurve() {{
                        setRecPhase("A相");
                        setRecIceHeight("1");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 05:10:26");
                    }});
                }});
            }});

            add(new IceThicknessCurvesDTO() {{
                setPhrase("B相");
                setList(new LinkedList<IceThicknessCurve>(){{
                    add(new IceThicknessCurve() {{
                        setRecPhase("B相");
                        setRecIceHeight("1");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 13:10:26");
                    }});
                    add(new IceThicknessCurve() {{
                        setRecPhase("B相");
                        setRecIceHeight("5");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 19:10:26");
                    }});
                    add(new IceThicknessCurve() {{
                        setRecPhase("B相");
                        setRecIceHeight("1");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 01:10:26");
                    }});
                }});
            }});

            add(new IceThicknessCurvesDTO() {{
                setPhrase("B相");
                setList(new LinkedList<IceThicknessCurve>(){{
                    add(new IceThicknessCurve() {{
                        setRecPhase("C相");
                        setRecIceHeight("1");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 02:34:27");
                        setRecUpdateTime("2019-01-13 13:10:26");
                    }});
                    add(new IceThicknessCurve() {{
                        setRecPhase("C相");
                        setRecIceHeight("5");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 03:10:26");
                    }});
                    add(new IceThicknessCurve() {{
                        setRecPhase("C相");
                        setRecIceHeight("1");
                        setRecBsId("CC2529");
                        setCreateDate("2019-01-13 21:34:27");
                        setRecUpdateTime("2019-01-13 04:10:26");
                    }});
                }});
            }});
        }};
    }

    private void initialFakePoint(List<IceThicknessCurvesDTO> result) {
        List<IceThicknessCurve> iceThicknessCurves = new LinkedList<>();

        result.stream().forEach(
                iceThicknessCurvesDTO -> {
                    iceThicknessCurves.addAll(iceThicknessCurvesDTO.getList());
                }
        );

        iceThicknessCurves.stream().forEach(
                iceThicknessCurve -> {
                    for (IceThicknessCurvesDTO iceThicknessCurvesDTO : result) {
                        if (!iceThicknessCurvesDTO.getPhrase().equalsIgnoreCase(iceThicknessCurve.getRecPhase())) {
                            iceThicknessCurvesDTO.getList().add(new IceThicknessCurve() {{ //為每條曲線設(shè)置空點(diǎn), 適配X時(shí)間軸
                                setRecUpdateTime(iceThicknessCurve.getRecUpdateTime());
                            }});
                        }
                    }
                }
        );
    }

    private void evaluateFakePoint(List<IceThicknessCurvesDTO> result) {
        // 每一條曲線需要為虛點(diǎn)附上數(shù)值
        for (IceThicknessCurvesDTO iceThicknessCurvesDTO : result) {
            List<IceThicknessCurve> list = iceThicknessCurvesDTO.getList();
            list.sort((o1, o2) -> (o1.getRecUpdateTime().compareTo(o2.getRecUpdateTime())));
            Iterator iterator = list.listIterator();
            IceThicknessCurve prevRealPoint = null;
            IceThicknessCurve nextRealPoint = null;
            IceThicknessCurve currentPoint;

            // 循環(huán)執(zhí)行每個(gè)點(diǎn), 作為當(dāng)前點(diǎn)
            while (iterator.hasNext()) {
                // 拿到當(dāng)前點(diǎn)
                currentPoint = (IceThicknessCurve) iterator.next();

                // 如果當(dāng)前點(diǎn)為實(shí)點(diǎn)
                if (isRealPoint(currentPoint)){
                    prevRealPoint = currentPoint;
                    continue;
                } else { // 如果當(dāng)前點(diǎn)為虛點(diǎn)

                    // 如果當(dāng)前點(diǎn)既是虛點(diǎn), 又是第一個(gè)點(diǎn)
                    ((ListIterator) iterator).previous();
                    boolean isFirstPoint = !((ListIterator) iterator).hasPrevious();

                    if (isFirstPoint) {

                        nextRealPoint = findNextRealPoint(iterator);

//                        需要實(shí)現(xiàn)不想克隆的部分, 要不然會(huì)出現(xiàn)覆蓋時(shí)間點(diǎn)的情況
//                        ObjectUtil.copyProperties(IceThicknessCurve.class, nextRealPoint,
//                                IceThicknessCurve.class, currentPoint);
                        currentPoint.setRecIceHeight(nextRealPoint.getRecIceHeight());
                        currentPoint.setCreateDate(nextRealPoint.getCreateDate());
                        currentPoint.setRecBsId(nextRealPoint.getRecBsId());
                        currentPoint.setRecPhase(nextRealPoint.getRecPhase());

                        prevRealPoint = currentPoint;

                        backToCurrentPoint(iterator, currentPoint, currentPoint.getClass());

                        continue;
                    }

                    nextRealPoint = findNextRealPoint(iterator);

                    if (!isRealPoint(nextRealPoint)) {

                        // 如果最后不存在實(shí)點(diǎn)
//                        ObjectUtil.copyProperties(IceThicknessCurve.class, prevRealPoint,
//                                IceThicknessCurve.class, currentPoint);
                        currentPoint.setRecIceHeight(prevRealPoint.getRecIceHeight());
                        currentPoint.setCreateDate(prevRealPoint.getCreateDate());
                        currentPoint.setRecBsId(prevRealPoint.getRecBsId());
                        currentPoint.setRecPhase(prevRealPoint.getRecPhase());

                    } else {
                        // 當(dāng)找到左右兩個(gè)實(shí)點(diǎn), 將當(dāng)前虛點(diǎn)轉(zhuǎn)為實(shí)點(diǎn)
                        currentPoint.setRecIceHeight(String.valueOf((Double.valueOf(prevRealPoint.getRecIceHeight())
                                + Double.valueOf(nextRealPoint.getRecIceHeight()))/2)) ;
                        currentPoint.setCreateDate(prevRealPoint.getCreateDate());
                        currentPoint.setRecBsId(prevRealPoint.getRecBsId());
                        currentPoint.setRecPhase(prevRealPoint.getRecPhase());
                    }
                    prevRealPoint = currentPoint;
                    backToCurrentPoint(iterator, currentPoint, currentPoint.getClass());
                }
            }
        }
    }

    /**
     *  指針重新回到當(dāng)前點(diǎn)
     * @param iterator
     * @param currentPoint
     * @param currentPointType
     */
    private void backToCurrentPoint(Iterator iterator, Object currentPoint, Class currentPointType) {
        while (((ListIterator) iterator).hasPrevious()) {
            if (((ListIterator) iterator).previous().equals(currentPointType.cast(currentPoint)))
                break;
        }
    }

    /**
     * 尋找下一個(gè)實(shí)點(diǎn)
     * @param iterator
     * @param <T>
     * @return
     */
    private <T extends IceThicknessCurve> IceThicknessCurve findNextRealPoint(Iterator iterator) {
        T nextRealPoint = null;
        while (iterator.hasNext()) {
            nextRealPoint = (T) iterator.next();
            if ((nextRealPoint).getRecIceHeight() == null || "".equals(nextRealPoint.getRecIceHeight())) {
                continue;
            } else {
                break;
            }
        }
        return nextRealPoint;
    }

    /**
     * 判斷傳入點(diǎn)是實(shí)點(diǎn)還是虛點(diǎn)
     * @param point
     * @param <T>
     * @return
     */
    private <T extends IceThicknessCurve> boolean isRealPoint(T point) {
        return point.getRecIceHeight() != null && !"".equals(point.getRecIceHeight());
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末污秆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昧甘,更是在濱河造成了極大的恐慌良拼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充边,死亡現(xiàn)場(chǎng)離奇詭異庸推,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浇冰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門贬媒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肘习,你說(shuō)我怎么就攤上這事际乘。” “怎么了漂佩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵脖含,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我投蝉,道長(zhǎng)养葵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任瘩缆,我火速辦了婚禮港柜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咳榜。我一直安慰自己夏醉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布涌韩。 她就那樣靜靜地躺著畔柔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪臣樱。 梳的紋絲不亂的頭發(fā)上靶擦,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天腮考,我揣著相機(jī)與錄音,去河邊找鬼玄捕。 笑死踩蔚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枚粘。 我是一名探鬼主播馅闽,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼馍迄!你這毒婦竟也來(lái)了福也?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤攀圈,失蹤者是張志新(化名)和其女友劉穎暴凑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赘来,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡现喳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了犬辰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拿穴。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忧风,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情球凰,我是刑警寧澤狮腿,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站呕诉,受9級(jí)特大地震影響缘厢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甩挫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一贴硫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伊者,春花似錦英遭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至法精,卻和暖如春多律,著一層夾襖步出監(jiān)牢的瞬間痴突,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工狼荞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辽装,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓相味,卻偏偏與公主長(zhǎng)得像拾积,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攻走,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,912評(píng)論 2 89
  • 一個(gè)人一無(wú)所有其實(shí)一點(diǎn)也不可怕殷勘,可怕的是一無(wú)所有還有一顆玻璃心,所以別讓你所謂的自尊心昔搂,斷送了你的前程玲销。 最近公司...
    半醒之間閱讀 252評(píng)論 0 1
  • 自從上了三年級(jí)用的鋼筆,我的煩惱又增多了摘符,有時(shí)墨水太多了滴大本子上字跡就看不清了贤斜。寫(xiě)錯(cuò)字時(shí),不能擦逛裤,因此書(shū)面很亂瘩绒。...
    d4cb7f3d2051閱讀 166評(píng)論 0 1
  • 第一天 觀察:1.對(duì)自己畫(huà)畫(huà)很享受,會(huì)要求我不準(zhǔn)看過(guò)程带族。完成后愿意分享锁荔。問(wèn)我喜歡她畫(huà)的哪個(gè) 2.對(duì)寫(xiě)字不太感興趣,...
    芷凡bonita閱讀 730評(píng)論 0 0