1. 程式人生 > >Java 兩個list資料根據某個欄位合併

Java 兩個list資料根據某個欄位合併

之前遇到一個需求,欄位是每小時那種(2018101208)。然後服務給我資料少了部分。然後我需要自已推算。然後補上沒有那些小時為單位的資料。這裡面也涉及到了自已設計出來資料list是全面的。所有的小時都有。然後把伺服器獲取list根據這個進行對比,補上伺服器沒有的小時數。兩個list根據某個欄位進行合併。

1、獲取過去15天的小時

初始化變數

    public String start_ts = "1537812000000";
    //解析出來歷史資料
    private List<HistoryData> historyDataList = new ArrayList<>();
    //自已推算的歷史資料
    private List<String> calculateDataList = new ArrayList<>();

獲取系統當前時間,推算15天前這個時間,然後把每小時存在List<String>裡面。這也是一個小小的演算法。

    public void SetContext(Context context) {
        if (mContext != null) mContext.clear();
        mContext = new WeakReference<Context>(context);

        long time = System.currentTimeMillis();

        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHH");
        String strNow = df.format(time);

        time = dateConvertMillionSec(strNow);
        //獲取當前時間,減去24小時。就是獲取過去一天每小時的資料
        long tempTime = 1000 * 60 * 60 * 24 * 15L;

        start_ts = String.valueOf(time - tempTime);

        for (int j = 1; j < 15; j++) {
            for (int i = 1; i < 25; i++) {
                calculateDataList.add(df.format(time - 1000 * 60 * 60 * j * i));
            }
        }
    }

    private long dateConvertMillionSec(String str) {
        long millionSeconds = 0;
        try {
            millionSeconds = new SimpleDateFormat("yyyyMMddHH").parse(str).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return millionSeconds;
    }

2、兩個list根據時間欄位合併

方法一,利用list裡面帶有contains方法進行欄位比較。把找出來List<HistoryData> 裡面沒有資料;放到List<HistoryData> 裡面HistoryData裡面欄位裡面。

            for (String temp : calculateDataList) {
                if (!tempList.contains(temp)) {
                    HistoryData historyData = new HistoryData();
                    historyData.setDatetime(temp);
                    historyDataList.add(historyData);
                }
            }

方法二、兩個for迴圈遍歷也是可以搞定的。

            for (String temp : calculateDataList) {
                boolean flag = false;
                for (HistoryData historyData : historyDataList) {
                    if (temp.equals(historyData.getDatetime())) {
                        flag = true;
                        break;
                    }
                }

                if (!flag) {
                    HistoryData historyData = new HistoryData();
                    historyData.setDatetime(temp);
                    historyDataList.add(historyData);
                }
            }

3、最後附帶一個list的排序方法,按時間排序

        Collections.sort(historyDataList, new Comparator<HistoryData>() {
            @Override
            public int compare(HistoryData temp1, HistoryData temp2) {
                //可以按User物件的其他屬性排序,只要屬性支援compareTo方法
                Integer it1 = Integer.valueOf(temp1.getDatetime());
                Integer it2 = Integer.valueOf(temp2.getDatetime());

                return it1.compareTo(it2);
            }
        });