首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中生成9位整数,而不重复相同的数字

在java中生成9位整数,而不重复相同的数字
EN

Stack Overflow用户
提问于 2022-07-14 15:00:11
回答 3查看 163关注 0票数 1

我对java编程很陌生,我正在使用数据库创建一个简单的银行管理系统。我需要创建具有9位数的帐号的用户帐户,而不是以0开头。此外,所有的帐号必须是不同的(一个帐号可以有重复数字)。每次我运行这个程序时,它都会给我一个9位数的数字,而不是存储在“account_number”下的“login_info”数据库下的“accounts”表中。

程序是这样运行的,

  • 用户转到登录页
  • ,如果他没有帐户,他可以转到创建帐户页
  • 创建帐户页面有3个选项卡、人事信息、银行帐户信息和在线帐户信息
  • 用户必须填写获得的个人信息才能在用户进入银行帐户信息时进入银行帐户信息< not >h 19,它显示先前填充的项目(个人信息)和一些附加项目--银行帐户类型和帐号H 210H 111当用户进入银行帐户信息选项卡时必须生成帐户号。用户无法更改帐号。(帐号必须是以前没有保存在数据库中的帐号)这是stuck
  • After选择帐户类型的步骤,用户可以转到联机帐户信息页面并选择唯一的用户名和password
  • After,用户可以按create帐户按钮与在线帐户一起创建他的银行帐户,或者如果他有第二个thoughts
  • When用户点击create account按钮,查询将运行并将数据插入MySQL表。这就是创建帐户的地方。

这个程序运行得很好,但我似乎无法生成一个独特的银行帐号。其他步骤已经完成。

(这不是针对任何商业产品,只是为了让我熟悉java数据库处理的项目。)

知道怎么做吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2022-07-14 17:54:04

下面是你可以采取的一种方法,详细阐述我在上面发表的评论:

预先计算所有有效帐号有3,265,920个有效组合(第一位数为1-9,

  • 9选项为2位数:0),因此,除了第三位的第一位数字(

  • 8)所用的数字(0-9)外,还有其他选项(

h 19 so:9*9*8*7*6*5*4*3*2 )。

table

  • include数据库中的
  • 将这300万个数字中的每一个填充为“状态”字段,以表示以下内容:“无人认领”、“未决”,"claimed"
  • all帐号从“无人认领”

开始。

在Java应用程序中,当您想向用户提供候选帐户号时,可以使用数据库将一行从“无人认领”更新到“挂起”,并返回该帐户号--因此,即使多个调用方同时尝试设置一个新帐户,数据库也会强制执行正确性。类似于:“更新status=unclaimed设置status=pending限制1的帐户”,并返回更新的行。

从那里:

  • 如果用户接受帐号,只需将状态从“未决”更改为“声明”
  • ,如果用户拒绝,则将其更改为“无人认领”

这种方法将允许您在创建所有初始无人认领帐户时,只需预先执行一次数字详细说明。它确实有一个潜在的缺点,那就是你有300万行未使用,但总体上来说很简单--不用担心进一步的组合,或者生成一个数字,然后让数据库来查看这个数字是否被要求(以及重新生成是否使用数字),或者在数据库中进行任何类型的扫描,作为数字选择过程的输入,或者其他人们可能想出的想法。先把工作做好。

票数 1
EN

Stack Overflow用户

发布于 2022-07-14 15:28:18

如果希望该数字是随机的,请创建一个从0到899 999 999的数字,然后添加100 000 000 (因此第一个数字永远不会是0)。如果这些数字存储在Arraylist中(在本例中称为num),下面的代码应该会有所帮助:

代码语言:javascript
复制
        int num;
        Do{
            num = (int)(Math.random()*800000000)+100000000;
        }while (nums.contains(num));
        nums.add(num);
票数 0
EN

Stack Overflow用户

发布于 2022-07-14 20:02:42

我正在使用数据库创建一个简单的银行管理系统。我需要创建具有9位数的帐号的用户帐户,而不是以0开头。此外,所有的帐号必须是不同的。每次我运行这个程序时,它都会给我一个9位数的数字,而不是存储在“account_number”下的“login_info”数据库下的“accounts”表中。

这实际上是一个出乎意料的复杂问题。最好的答案取决于你没有提到的其他因素:

  • 是“每次运行程序时”还是“每次请求帐户号时”(但不一定从运行到运行)都必须是唯一的?
  • 是否是一个单线程环境(即,有多少同时执行的线程可能同时尝试创建帐号)?
  • 是否具有同一性;它是否需要在任何时候都能唯一地标识特定的帐户(或者是否存在从窗体创建帐户的时候,或者帐户不需要有标识的时候?
  • ,管理标识的是什么时候?你的程序系统?用于存储information?

的数据库。

如果第一个项目回答是“每次运行程序”,那么您需要考虑帐户号种子(用于生成下一个可用帐户号的数量或数量)是如何从run持久化到运行的(否则当JVM退出时,种子就会被销毁)。

如果第二个项目是“多个线程”,那么您需要考虑如何防止无意中同时向请求一个的线程提供相同的帐号。

剩下的子弹处理身份。帐号通常用于标识系统的特定帐户(但不一定)。因此,您必须考虑身份何时需要对系统可用。您还必须考虑哪个系统负责管理身份。如果在创建帐户实体时就需要标识,则需要在Java实例化帐户期间获得标识。如果在帐户实体被持久化到数据库之前不需要它,那么数据库系统可能会创建标识。

混合解决方案是在帐户被实例化后立即持久化它,然后再次读取它以获得帐户号(代价是增加数据库流量)。如果帐户最终不需要持久化,则可能需要逻辑来删除数据库记录(例如,因为它已被取消)。

根据这些问题的答案,以及其他重要因素,如可用性、可扩展性、冗余性、安全性等,原始问题的完整解决方案可能会变得任意复杂。

但是,如果我们假设帐户号只需要在Java系统的相同运行过程中是唯一的,并且帐户访问仅是单线程的,那么解决方案可能变得非常简单:

代码语言:javascript
复制
public static class AccountNumberManager {
    private static long accountNumberSeed = getStartupSeedValue();

    private AccountNumberManager() { }

    public long getNextAccountNumber() {
        return ++accountNumberSeed;
    }

    private static long getStartupSeedValue() {
        return 100000000L;
    }
}

一些简短的说明:

  • 用于帐户号管理的static类使帐户号种子值线程的初始化安全。当类加载程序在加载过程中锁定类时发生初始值初始化,因此线程安全(类及其静态字段只能初始化一次和一次)。这是静态holder类初始化方法。如果系统演变成并发的environment.

,这将非常方便。

当然,

  • 此解决方案假定初始化帐户实体时需要帐户号。我觉得这是个很好的做法。我的偏见是,数据库系统不应在可能的情况下用于创建系统范围的标识符(只用于持久化)。

  • 使用帐号作为数据库主键并不是最佳做法。这是一种相当广泛的观点,但并不普遍,而是普遍持有。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72982645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档