【问题标题】:expanding 2 digit numeric range with alphabet用字母扩展 2 位数字范围
【发布时间】:2015-09-08 08:47:27
【问题描述】:

我有一个字符串表示具有 2 位数字前缀 + 固定代码 + 自己的值(操作员 ID)的唯一值,就像这样

01DD001,01DD002, ..,99DD999

字符串已指定长度,DD 部分的长度不能更改。当我设计这个唯一标识符时,我被告知前缀永远不会超过 99。现在我们必须扩展前缀,因为操作员 id 超过了 99。所以如果我想扩展范围,我必须将十进制前缀更改为两位数十六进制,它给我的范围是 0-256。 其他可能的解决方案是将其作为字符串进行威胁,并使用整个字母表来扩展唯一标识符的可能数量

100 = A0 , 
111 = B1 ,
129 = C9... 

所以问题是是否有一些库会使用第二种方法(或类似方法)

【问题讨论】:

  • 哦,古老的“我被告知 永远不会超过 。”。你猜怎么着,它超过了。你应该做好最坏的准备,我会使用整个字母表,以后你可能需要添加另一个数字。

标签: java alphanumeric


【解决方案1】:

您可以使用BigInteger。它有一个方便的toString(int radix),您可以使用最高为Character.MAX_RADIX 的基数,通常为36,最大值为ZZ = 1295

【讨论】:

  • @hege_hegedus - 如果你丢弃所有只有0-9 的数字,你只会输掉99,它仍然会将你的范围扩大1000+。不过我会尝试想出更好的方法。
  • 我认为这是一个很好的解决方案。我必须保留 allredy 生成的值,因此我必须以旧方式处理小于 100 的数字,并且使用此解决方案,最后一个冲突值为 81。我可以使用此解决方案。谢谢 。基础 api 中这么好的功能。
  • 请记住,使用 BigInteger 使用一些大基数解析“99”不会给你 99 作为整数
【解决方案2】:

您总是可以发明自己的编号系统。这是一个格式良好且可逆的示例,但如果您仅限于大写,则只会为您提供0 - 1036 的范围。

/**
 * Number system where 0-99 appear as 0-99 but beyond that we can use A-Z.
 *
 * @param n - The number to convert.
 * @return - It's representation in this strange form.
 */
public static String strangeNumber(int n) {
    if (n < 100) {
        // 0 - 99 - The old way.
        String s = "00" + n;
        return s.substring(s.length() - 2);
    } else {
        // Done the first 100.
        n -= 100;
        // First digit is now 'A', 'B' ...
        int firstDigit = 'A' + (n / 36);
        if (firstDigit > 'Z') {
            throw new NumberFormatException("Cannot format number " + n);
        }
        int remainder = n % 36;
        int secondDigit = remainder < 10 ? '0' + remainder : 'A' + (remainder - 10);
        return Character.toString((char) firstDigit) + Character.toString((char) secondDigit);
    }
}

public void test() {
    for (int i = 0; i < 1036; i++) {
        System.out.println(i + " = " + strangeNumber(i));
    }
}

【讨论】:

  • 不错的解决方案,我想使用这样的想法,但我更喜欢 BigInteger.toString(Character.MAX_RADIX)。
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 2012-05-30
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2021-10-08
相关资源
最近更新 更多