用两个可能的输入值初始化一个数组

4
我正在研究 Luhn 测试问题,希望使用一维数组构建程序。我已经初始化了一个具有 16 个数字的数组,但我希望能够根据用户输入的数字来初始化数组。
   //create scanner object
   Scanner input = new Scanner(System.in);

   //declare variable
   long [] cc_num = new long[16];

   //get input
   System.out.print("Enter 15 or 16-digit credit card number: ");
   //long cc_num = input.nextLong();
   for (int i = 0; i < cc_num.length; i++) {
       cc_num[i] = input.nextLong();
    }

如何根据输入的长度(需要为15或16)初始化数组?


你使用 nextLong() 有些混淆。如果你想让用户输入一个15或16位数的数字,第一个 nextLong() 将会读取整个数字(除非他们在每个数字之间加上空格)。第二个 nextLong() 将等待另一个信用卡号码。 - ajb
1
接受用户输入数组长度,创建一个具有该长度的新数组,然后像平常一样迭代它。有什么困惑的呢?你手头上有所有必要的工具来完成这个任务。 - Kon
1
此外,如果您希望每个数组元素仅存储一个数字,那么long是否有些过度呢?这并不是说它是错误的,但这让我相信您还没有完全确定变量应该保存哪些值。 - ajb
你如何获取用户输入的长度?@Kon - Parth
2个回答

6

首先获取输入,然后获取长度,接着构建数组。大致如下:

//get input
System.out.print("Enter 15 or 16-digit credit card number: ");
String cardStr = input.nextLine();
long [] cc_num = new long[cardStr.length()];

对我来说,int[] cc_num = new int[cardStr.length()]; 更有意义。因为cc_num本身就是一个包含16个数字的数组。如果直接将cc num保持在变量(非数组)中,那么long类型可能更合适。你有什么看法Elliott? - JavaHopper
@JavaHopper 是的,使用 int[](甚至是 byte[]),或者也许是 cardStr.toCharArray() 都是可能的内存使用优化 - Elliott Frisch
@ElliottFrisch,我最好将cc_num保存在一个变量(非数组)中,然后将每个数字转移到数组位置中吗? - Parth
我不觉得需要将它存储在数组中。你在这里看到了什么需求? - JavaHopper
@ziggy 听起来像是另一个问题。当实现 Luhn 算法 时,我会使用 toCharArray() 方法(个人建议)。 - Elliott Frisch
@JavaHopper 我在考虑对CC验证规则中的数组引用位置。使用数组似乎会使其更加困难,因此我将采用其他方法。谢谢大家! - Parth

6

我同意Elliott所提出的。但我好奇为什么要使用long数据类型。如果您要将信用卡存入变量中,long就是解决方案。16个数字完全适合long。以下是我会使用的代码:

System.out.print("Enter 15 or 16-digit credit card number: ");
String cardStr = input.nextLine();
int [] cc_num = new int[cardStr.length()];

更好的方式
System.out.print("Enter 15 or 16-digit credit card number: ");
String cardStr = input.nextLine();
long cc_num = Long.parseLong(cardStr);

最佳方式
System.out.print("Enter 15 or 16-digit credit card number: ");
String cardStr = input.nextLine();
//store as string itself, so that leading 0's are preserved
//it really makes more sense because no arithemtic operations are performed on cc numbers

我认为对于那些实际上只是数字串的“数字”,不应该使用longint。信用卡号码并不像一个数字——据我所知,它不是用于计算的整数。虽然会用到每个数字,但不会用到整个数字。最大的问题在于,当你有一串数字时,该字符串可能包含前导0,如果将其视为一个数字,则这些前导0将被丢失。也许这对于信用卡号码来说是不可能的,但是对于邮政编码来说却是可能的,而且我已经在其他情况下看到过这个问题。 - ajb
@ajb +1 这是人们在实时中使用的。我已经相应地编辑了答案。但就目前而言,这个问题只是为了演示动态数组是如何构建的,以用户输入为大小。谢谢! - JavaHopper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接