All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.xiaoyuge5201.net.Span Maven / Gradle / Ivy

There is a newer version: 1.3.5
Show newest version
package com.github.xiaoyuge5201.net;

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

/**
 * 数据区间对象
 * 存放ID最小和最大值
 * 包含一个区间的完整性信息。
 *
 * @author Luxiaolei
 */
public class Span {

    /**
     * ID
     */
    public long id;
    /**
     * 此区间的名称
     */
    public String name;

    /**
     * 最小ID值
     */
    public long min = Long.MAX_VALUE;
    /**
     * 最大ID值
     */
    public long max = 0;

    /**
     * 区间内的ID数
     */
    public int count;

    /*--------------------------构造方法 start-------------------------------*/
    public Span() {
    }

    /**
     * @param id   区间ID
     * @param name 区间名称
     */
    public Span(long id, String name) {
        this.id = id;
        this.name = name;
    }

    /**
     * @param min 最小ID
     * @param max 最大ID
     */
    public Span(long min, long max) {
        this.min = min;
        this.max = max;
    }

    /**
     * @param name 段名称
     * @param min  最小ID
     * @param max  最大ID
     */
    public Span(String name, long min, long max) {
        this.name = name;
        this.min = min;
        this.max = max;
    }

    /**
     * @param min   最小ID
     * @param max   最大ID
     * @param count 初始数目
     */
    public Span(long min, long max, int count) {
        this.min = min;
        this.max = max;
        this.count = count;
    }

    /**
     * @param id  ID
     * @param min 最小ID
     * @param max 最大ID
     */
    public Span(long id, long min, long max) {
        this.id = id;
        this.min = min;
        this.max = max;
    }
    /*--------------------------构造方法 end-------------------------------*/

    /*--------------------------功能方法 start-------------------------------*/

    /**
     * 实例化一个空Span
     *
     * @return Span空对象
     */
    public static Span newInstance() {
        return new Span();
    }

    /**
     * 获得两数之差
     *
     * @return 两数差
     */
    public long getSub() {
        return max - min;
    }

    /**
     * 切割此ID区间为更小的ID区间对象
     *
     * @param partCount 分成多少份
     * @return 切割后的区间对象集合
     */
    public List cut(int partCount) {
        if (partCount == 0) return null;
        List list = new ArrayList();

        //数据不足以分开,则只返回一份
        if (partCount == 0 || getSub() == 0) {
            list.add(this);
            return list;
        }
        //先分成partCount-1份完整的,将剩余部分给最后一份
        long part = getSub() / partCount;
        for (int i = 0; i < partCount; i++) {
            long startId = part * i + this.min;
            //若为最后一批,将剩余的ID全部给之,否则给一个部分
            long endId = (i >= partCount - 1) ? this.max : (startId + part - 1);

            list.add(new Span(i, startId, endId));
        }
        return list;
    }

    /**
     * ID区间是否为空。
     * 判断方式:max == 0 或 min == max
     *
     * @return 是否为空
     */
    public boolean isEmpty() {
		return max == 0 || min > max;
	}

    /**
     * 比较并替换掉对象中已经存在的ID
* ID计数 +1
* 所提供ID如果大于max或小于min时,替换掉相应的值 * * @param number 被检查的数字 */ public void compareToReplace(long number) { if (number > max) max = number; if (number < min) min = number; } /** * 是否在区间之内(闭区间) * * @param number 数字 * @return 是否在区间内 */ public boolean isInBetween(long number) { return (number >= min && number <= max); } /*--------------------------功能方法 end-------------------------------*/ }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy