Thuật toán ưu tiên dựa trên cấp độ và thời gian

Mô tả thuật toán

Thuật toán này kết hợp cấp độ và thời gian để xác định mức ưu tiên.

Cấp độ càng cao, mức ưu tiên càng cao Trong cùng một cấp độ, thời gian sớm hơn có mức ưu tiên cao hơn

Thực hiện

Phương thức chính

determinePriority

import com.example.enums.LevelEnum;
import org.apache.commons.lang3.StringUtils;

/**
 * Dịch vụ xác định mức ưu tiên
 */
public class PriorityDeterminer {

    /**
     * Thời điểm cơ sở: 2024-01-01 00:00:00 (giây)
     */
    private static final Long BASE_TIMESTAMP = 1704067200L;

    /**
     * Tiền tố
     */
    private static final String PREFIX = "A";

    /**
     * Xác định mức ưu tiên dựa trên cấp độ và thời gian
     * Cấp độ càng cao, thời gian sớm hơn thì mức ưu tiên càng cao
     *
     * @param level Cấp độ của mục, tối đa 2 chữ số
     * @param timestamp Thời điểm cần tính ưu tiên (miligiây hoặc giây)
     * @return Chuỗi biểu diễn mức ưu tiên: chuỗi càng lớn, mức ưu tiên càng cao
     */
    public String determinePriority(LevelEnum level, Long timestamp) {
        // Chuyển đổi từ miligiây sang giây nếu cần
        if (timestamp.toString().length() == 13) {
            timestamp /= 1000;
        }
        if (timestamp.toString().length() != 10) {
            throw new IllegalArgumentException("Định dạng thời gian không hợp lệ");
        }
        String levelPriority = String.valueOf(level.getPriorityValue());
        String timePriority = String.valueOf(Integer.MAX_VALUE - (timestamp - BASE_TIMESTAMP));
        levelPriority = StringUtils.leftPad(levelPriority, 2, "0");
        timePriority = StringUtils.leftPad(timePriority, 12, "0");
        return new StringBuilder().append(PREFIX).append(levelPriority).append(timePriority).toString();
    }
}

Sử dụng: Integer.MAX_VALUE - (timestamp - BASE_TIMESTAMP) để tính mức ưu tiên theo thời gian Mức ưu tiên cấp độ là 2 chữ số, thiếu thì bù bằng 0 ở bên trái Mức ưu tiên thời gian là 12 chữ số, thiếu thì bù bằng 0 ở bên trái Kết quả cuối cùng: 1 chữ cái tiền tố+2 chữ số mức ưu tiên cấp độ+12 chữ số mức ưu tiên thời gian = chuỗi 13 chữ số

Kiểu liệt kê cấp độ

LevelEnum

/**
 * Kiểu liệt kê cấp độ
 */
public enum LevelEnum {
    LEVEL_ONE("Cấp 1", 1),
    LEVEL_TWO("Cấp 2", 2),
    LEVEL_THREE("Cấp 3", 3),
    LEVEL_FOUR("Cấp 4", 4),
    LEVEL_FIVE("Cấp 5", 5),
    LEVEL_SIX("Cấp 6", 6),
    LEVEL_SEVEN("Cấp 7", 7),
    LEVEL_EIGHT("Cấp 8", 8),
    LEVEL_NINE("Cấp 9", 9),
    LEVEL_TEN("Cấp 10", 10);

    private final String description;
    private final int priorityValue;

    LevelEnum(String description, int priorityValue) {
        this.description = description;
        this.priorityValue = priorityValue;
    }

    public String getDescription() {
        return description;
    }

    public int getPriorityValue() {
        return priorityValue;
    }
}

Kiểm thử

  • Mã kiểm thử
    @Test
    public void testDeterminePriority() {
        // Cấp 1 + 2024-02-01 00:00:00
        System.out.println(determinePriority(LevelEnum.LEVEL_ONE, 1706745600L));
        // Cấp 1 + 2024-03-01 00:00:00
        System.out.println(determinePriority(LevelEnum.LEVEL_ONE, 1709251200L));
        // Cấp 9 + 2024-02-01 00:00:00
        System.out.println(determinePriority(LevelEnum.LEVEL_NINE, 1706745600L));
        // Cấp 9 + 2024-03-01 00:00:00
        System.out.println(determinePriority(LevelEnum.LEVEL_NINE, 1709251200L));
        // Cấp 10 + 2024-02-01 00:00:00
        System.out.println(determinePriority(LevelEnum.LEVEL_TEN, 1706745600L));
        // Cấp 10 + 2024-03-01 00:00:00
        System.out.println(determinePriority(LevelEnum.LEVEL_TEN, 1709251200L));
    }
  • Kết quả kiểm thử
A012144805247
A012142299647
A092144805247
A092142299647
A102144805247
A102142299647

Thẻ: Java PriorityAlgorithm TimeBasedPriority LevelBasedPriority

Đăng vào ngày 26 tháng 6 lúc 05:07