【问题标题】:Not able to generate a unique user-number无法生成唯一的用户编号
【发布时间】:2015-05-08 19:44:10
【问题描述】:

当我尝试在我的应用程序中生成唯一的客户 ID 时遇到问题。我希望数字从 1 开始向上。我有一个使用树形图的注册类,它使用以下代码生成下一个客户编号:

public String generateNumber()
{
    int number = 1;

    for(Map.Entry<String, Forsikringkunde> entry : this.entrySet())
    {
        if(entry.getValue().getNumber().equals(String.valueOf(number)))
        {
            number++;
        } 
    }return String.valueOf(number);
}

当我在我的应用程序中生成客户时,即使我遍历地图,我也会得到重复的数字。创建客户时,我创建了对象,运行此方法,对 ID 使用 set-method 并将其添加到寄存器中,但它不起作用。谁有解决办法?

【问题讨论】:

  • 不确定,但并非每张地图都会保存您将元素放入其中的顺序。也许地图在同一个对象上迭代了几次? - 见stackoverflow.com/questions/2889777/…
  • 啊,我的错。应该是数字。只是忘了翻译那部分代码。

标签: java unique-id


【解决方案1】:

如果你使用的是 Java 8,我建议你试试这个:

int max = this.values()
              .stream()
              .map(Forsikringkunde::getNumber)
              .mapToInt(Integer::parseInt)
              .max()
              .orElse(0);

return String.valueOf(max + 1);

【讨论】:

    【解决方案2】:

    修改代码以找到地图中的最大数字,然后使用那个+1:

    public String generateNumber()
    {
        int max = -1;
    
        for(Map.Entry<String, Forsikringkunde> entry : this.entrySet())
        {
            int entry = Integer.parseInt(entry.getValue().getNumber());
            if(entry > max)
            {
                max = entry;
            } 
        }
        return String.valueOf(max + 1);
    }
    

    (这模仿了你的编码风格。aioobe 的回答展示了如何更优雅地做同样的事情。)

    您的方法不起作用,因为地图没有按顺序迭代。例如,如果您遍历两个分别编号为 21 的用户,会发生以下情况:

    1. 以“number = 1”开头
    2. 检查是否number == 2:不是,所以继续
    3. 检查是否number == 1:是,所以设置number = 2

    现在循环完成,number 为 2,即使 id 为 2 的用户已经存在。如果它按顺序迭代,它就会起作用。

    【讨论】:

    • 非常感谢!那成功了。以为这就是我在原始代码中所做的......
    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2017-04-06
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多