依據對象元素的某個參數對List進行排序算法


依據對象元素的某個參數對List進行排序算法


在java開發中,我們經常會遇到一些問題需要對數據進行排序處理,那麼在list集合的使用中,怎樣根據集合中的對象的某個參數爲參照進行集合的排序呢?

今天爲大家分享一個比較愚笨的排序方式:

每個list集合的數據都會是一個類對象,在每個類對象中都會有若干個變量存在。那麼我們就以對象中的變量爲參照,進行排序。

首先,將需要參照的類變量取出,存放在一個可以進行元素大小比較的數組中,這裏我用到long數組。請參考代碼:

ArrayList<Order> orders = new ArrayList<Order>();
long[] condition = new long[orders.size()];
for (int i = 0; i < orders.size(); i++) {
    condition[i] = orders.get(i).getStartTime().getTime();
}
SortAlgorithmUtil.selectSort(orders, condition, "asc");
SortAlgorithmUtil.exchangeSort(orders, condition, "asc");
SortAlgorithmUtil.insertSort(orders, condition, "asc");

然後,創建一個排序種類的工具類(重點)。請參照代碼:

package com.example.listdelectdemo;

import java.util.List;

/**
 * 排序算法工具類 作者:小明的碼路
 * 
 * @author warmdoc_ANDROID_001
 * 
 */
public class SortAlgorithmUtil {

    /**
     * 交換排序法/冒泡排序法 :對相鄰兩元素進行比較、進行交換,嵌套for每次循環依據條件數組將最大元素往後移動,下一次循環將剩餘元素進行類似操作。
     * 適用:初始狀態基本有序,不需要進行反覆元素交換
     * 
     * @param <E>
     *            list中的泛型實體對象
     * 
     * @param rawDatas
     *            進行排序的數據集合
     * @param condition
     *            要排序的條件,來自數據集合的每一個對象代表
     * @param sortType
     *            排序類型 正序/倒序
     */
    public static <E> void exchangeSort(List<E> rawDatas, long[] condition, String sortType) {
        if (sortType.equals("asc")) { // 正序
            for (int i = 1; i < condition.length; i++) {
                // 比較條件數組中相鄰的兩個元素,較大的數往後移動
                for (int j = 0; j < condition.length - i; j++) {
                    if (condition[j] > condition[j + 1]) {
                        // 交換相鄰兩個元素的位置
                        swapElement(rawDatas, condition, j, j + 1);
                    }
                }
            }
        } else if (sortType.equals("desc")) { // 倒序
            for (int i = 1; i < condition.length; i++) {
                // 比較條件數組中相鄰的兩個元素,較小的數往後移動
                for (int j = 0; j < condition.length - i; j++) {
                    if (condition[j] < condition[j + 1]) {
                        // 交換相鄰兩個元素的位置
                        swapElement(rawDatas, condition, j, j + 1);
                    }
                }
            }
        }

    }

    /**
     * 選擇排序法/直接排序法 :嵌套for每次循環依據排序條件從待排序的數組元素中選出最小或最大的一個元素,並依次排列組合。
     * 特點:交換次數比冒泡排序少,速度較冒泡排序高
     * 
     * @param <E>
     *            list中的泛型實體對象
     * 
     * @param rawDatas
     *            進行排序的數據集合
     * @param condition
     *            要排序的條件,來自數據集合的每一個對象代表
     * @param sortType
     *            排序類型 正序/倒序
     */
    public static <E> void selectSort(List<E> rawDatas, long[] condition, String sortType) {
        if (sortType.equals("asc")) {
            int record;
            for (int i = 1; i < condition.length; i++) {
                record = 0;
                for (int j = 1; j <= condition.length - i; j++) {
                    if (condition[j] > condition[record]) {
                        record = j;
                    }
                }
                // 交換condition.length - i和當前最小元素
                swapElement(rawDatas, condition, condition.length - i, record);
            }
        } else if (sortType.equals("desc")) {
            int record;
            for (int i = 1; i < condition.length; i++) {
                record = 0;
                for (int j = 1; j <= condition.length - i; j++) {
                    if (condition[j] < condition[record]) {
                        record = j;
                    }
                }
                // 交換condition.length - i和當前最小元素
                swapElement(rawDatas, condition, condition.length - i, record);
            }
        }

    }

    /**
     * 插入排序法 :嵌套for每次循環將新增的一項元素與已處理的元素進行依次比較並排在適當位置,每次將生成一個新的有序數組 
     * 特點:性能較好。
     * 適用:當記錄規模較小時
     * 
     * @param <E>
     *            list中的泛型實體對象
     * 
     * @param rawDatas
     *            進行排序的數據集合
     * @param condition
     *            要排序的條件,來自數據集合的每一個對象代表
     * @param sortType
     *            排序類型 正序/倒序
     */
    public static <E> void insertSort(List<E> rawDatas, long[] condition, String sortType) {
        if (sortType.equals("asc")) {
            for (int i = 1; i < condition.length; i++) {
                for (int j = 0; j < i; j++) {
                    if (condition[j] > condition[i]) {
                        // 交換x和y兩個元素
                        swapElement(rawDatas, condition, i, j);
                    }
                }
            }
        } else if (sortType.equals("desc")) {
            for (int i = 1; i < condition.length; i++) {
                for (int j = 0; j < i; j++) {
                    if (condition[j] < condition[i]) {
                        // 交換x和y兩個元素
                        swapElement(rawDatas, condition, i, j);
                    }
                }
            }
        }

    }

    /**
     * 交換指定元素的位置
     * 
     * @param <E>
     * @param rawDatas
     * @param condition
     * @param x
     * @param y
     */
    private static <E> void swapElement(List<E> rawDatas, long[] condition, int x, int y) {

        long tempC = condition[x];
        condition[x] = condition[y];
        condition[y] = tempC;
        if (rawDatas != null) {
            E temp = rawDatas.get(x);
            rawDatas.set(x, rawDatas.get(y));
            rawDatas.set(y, temp);
        }
    }

}

最後,使用最初創建的list集合,將實現排序效果。

本人技術水平較一般,代碼中有不足之處望指教。謝謝!

發佈了27 篇原創文章 · 獲贊 94 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章