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

  • 本文关键字:数字 整数 9位 java 一个 java
  • 更新时间 :
  • 英文 :


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

程序是这样运行的

  • 用户进入登录页面
  • 如果他没有帐户,他可以转到创建帐户页面
  • 创建账户页面有3个选项卡,人员信息、银行账户信息和在线账户信息
  • 用户必须填写人员信息才能转到银行账户信息
  • 当用户转到银行账户信息时,它会显示以前填写的项目(Personel信息)和几个附加项目-银行账户类型和账号
  • 用户进入银行账户信息页签时必须生成账号。用户不能更改账号。(帐号必须是以前没有保存在数据库中的帐号)这是我被卡住的步骤
  • 选择帐户类型后,用户可以转到在线帐户信息页面并选择唯一的用户名和密码
  • 之后,用户可以点击创建帐户按钮来创建他的银行帐户和在线帐户,或者如果他有其他想法,他可以退出程序
  • 当用户点击创建帐户按钮时,将运行一个查询并将数据插入MySQL表中。这就是创建帐户的位置

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

(这不适用于任何商业产品,只是我为熟悉java数据库处理而进行的一个项目。)

知道怎么做吗?

谢谢。

以下是您可以采取的方法,详细介绍了我在上面发表的评论:

  • 预先计算所有有效账号–共有3265920个有效组合
    • 第一位有9个选项:1-9
    • 第二个数字有9个选项:0可用,所以除了第一个数字使用了一些数字外,还有10个可能的数字(0-9)
    • 第三等8个选项
    • so:9*9*8*7*6*5*4*3*2组合
  • 将这大约300万个数字中的每一个填充到数据库表中
  • 包括一个";"状态";字段来表示诸如:";无人认领""待定"声称">
  • 所有帐号都以";无人认领">

在您的Java应用程序中,当您想向用户提供候选帐号时,您可以使用数据库从"更新一行;无人认领";至";挂起";并返回该帐号–因此,即使多个呼叫者同时尝试设置一个新帐户,数据库也会强制执行正确性。类似于:";更新状态=无人认领设置状态=未决限额1"的帐户;并返回更新后的行。

从那里:

  • 如果用户接受帐号,只需将状态从";挂起";至";声称">
  • 如果他们拒绝了,就把它改回";无人认领">

这种方法允许您在创建所有初始无人认领帐户时,只提前执行一次数字细节。它确实有一个潜在的缺点,即有300万行未使用,但总体上很简单——无需担心进一步的组合,或者生成一个数字,然后让数据库查看该数字是否被认领(如果数字正在使用,则重新生成),或者通过数据库进行任何形式的扫描,用作数字选择过程的输入,或者人们可能想到的任何其他想法。先把工作做好。

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

int num;
Do{
num = (int)(Math.random()*800000000)+100000000;
}while (nums.contains(num));
nums.add(num);

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

事实证明,这是一个出乎意料的复杂问题。最佳答案取决于你没有提到的其他因素:

  • 帐号必须是唯一的吗;每次运行程序时;或";每次在同一次运行期间(但不一定是从一次运行到另一次运行)请求帐号">
  • 这是一个单线程环境吗(即,有多少同时执行的线程可能试图同时创建帐号)
  • 账号是否具有身份的含义;它是否需要能够始终唯一地识别特定的帐户(或者有时,也许是从表单创建帐户时,帐户不需要具有标识
  • 是什么管理身份?你的程序系统?您用来存储信息的数据库

如果第一个项目符号项的答案是"0";每次程序运行时";,然后,您需要考虑帐号种子(用于生成下一个可用帐号的数量)是如何从一次运行到另一次运行的持久化的(否则,当JVM退出时,种子会被销毁)。

如果第二项目符号项是"0";多线程";,然后,您需要考虑如何防止同一帐号被无意中提供给同时请求帐号的线程。

剩下的项目符号与身份有关。账号通常用于识别系统的特定账户(但不一定)。因此,您必须考虑身份何时需要对系统可用。您还必须考虑什么系统负责管理身份。如果在创建帐户实体后立即需要该标识,则需要在Java实例化帐户期间获得该标识。如果在帐户实体被持久化到数据库之前不需要它,那么数据库系统可以创建标识。

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

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

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

public static class AccountNumberManager {
private static long accountNumberSeed = getStartupSeedValue();
private AccountNumberManager() { }
public long getNextAccountNumber() {
return ++accountNumberSeed;
}
private static long getStartupSeedValue() {
return 100000000L;
}
}

一些简要说明:

  • 用于帐号管理的static类使帐号种子值线程的初始化是安全的。初始值初始化发生在类在加载过程中被类加载器锁定时,因此是线程安全的(类及其静态字段只能初始化一次)。这是静态持有者类初始化方法。如果系统发展成为并发环境,这将非常方便。

  • 当然,这个解决方案假设在初始化帐户实体时需要帐号。无论如何,我认为这是一个很好的做法。我的偏见是,在可能的情况下,不应该使用数据库系统来创建系统范围的标识符(只是为了持久化它们)。

  • 将帐号用作数据库主键不是最佳做法。这是一种相当广泛但并非普遍的观点。

最新更新