[英]int array to int number in Java
我是这个网站的新手,如果我在这里,那是因为我在网络上的任何地方都没有找到答案,相信我:我已经用谷歌搜索了很长时间,但我能找到的只是如何转换编号到数组而不是相反。 我正在寻找一种将 int 数组转换为 int 数的简单方法或函数。 让我解释一下,例如我有这个:
int[] ar = {1, 2, 3};
我想要这个:
int nbr = 123;
在我的脑海中它看起来像这样(即使我知道这不是正确的方法):
int nbr = ar.toInt(); // I know it's funny
如果您对我如何做到这一点有任何想法,那就太棒了。
从0
结果开始。 循环遍历int
数组的所有元素。 将结果乘以10
,然后将数组中的当前数字相加。 在循环结束时,你有你的结果。
这可以通过将基数从10
(此处)更改为其他值来推广到任何基数,例如16
进制的 16。
您必须在数组中循环并添加正确的值。 正确的值是数组中的当前元素乘以 10^position。
所以:ar[0]*1 + ar[1]*10 + ar[2] *100 + .....
int res=0;
for(int i=0;i<ar.length;i++) {
res=res*10+ar[i];
}
或者
for(int i=0,exp=ar.length-1;i<ar.length;i++,exp--)
res+=ar[i]*Math.pow(10, exp);
首先,您必须将每个数字转换为字符串,然后连接字符串并将其解析回整数。 这是一个实现:
int arrayToInt(int[] arr)
{
//using a Stringbuilder is much more efficient than just using += on a String.
//if this confuses you, just use a String and write += instead of append.
StringBuilder s = new StringBuilder();
for (int i : arr)
{
s.append(i); //add all the ints to a string
}
return Integer.parseInt(s.toString()); //parse integer out of the string
}
请注意,如果数组中第一个值之后的任何值为负数,则会产生错误,因为减号会干扰解析。
此方法适用于所有正整数,但如果您知道数组中的所有值都只有一位长(如您的示例中所示),您可以完全避免字符串操作,只需使用基本数学:
int arrayToInt(int[] arr)
{
int result = 0;
//iterate backwards through the array so we start with least significant digits
for (int n = arr.length - 1, i = 1; n >= 0; n --, i *= 10)
{
result += Math.abs(arr[n]) * i;
}
if (arr[0] < 0) //if there's a negative sign in the beginning, flip the sign
{
result = - result;
}
return result;
}
如果第一个之后的任何值是负数,此版本不会产生错误,但会产生奇怪的结果。
没有内置函数可以执行此操作,因为数组的值通常表示不同的数字,而不是数字中的数字。
编辑:
为了回应您的评论,请尝试使用此版本来处理多头:
long arrayToLong(int[] arr)
{
StringBuilder s = new StringBuilder();
for (int i : arr)
{
s.append(i);
}
return Long.parseLong(s.toString());
}
编辑2:
针对您的第二条评论:
int[] longToIntArray(long l)
{
String s = String.valueOf(l); //expand number into a string
String token;
int[] result = new int[s.length() / 2];
for (int n = 0; n < s.length()/2; n ++) //loop through and split the string
{
token = s.substring(n*2, (n+2)*2);
result[n] = Integer.parseInt(token); //fill the array with the numbers we parse from the sections
}
return result;
}
是的,您可以自己编写函数
int toInt(int[] array) {
int result = 0;
int offset = 1;
for(int i = array.length - 1; i >= 0; i--) {
result += array[i]*offset;
offset *= 10;
}
return result;
}
我认为它背后的逻辑非常简单。 您只需遍历数组(首先是最后一个元素),然后将数字乘以 10 的右幂“将数字放在正确的位置”。 最后你会得到返回的号码。
int nbr = 0;
for(int i = 0; i < ar.length;i++)
nbr = nbr*10+ar[i];
最后,你最终得到了你想要的 nbr。
对于你给我们的新阵列,试试这个。 我看不到使用某种形式的 String 的方法,你将不得不使用 long,而不是 int。
int [] ar = {2, 15, 14, 10, 15, 21, 18};
long nbr = 0;
double multiplier = 1;
for(int i = ar.length-1; i >=0 ;i--) {
nbr += ar[i] * multiplier;
multiplier = Math.pow(10, String.valueOf(nbr).length());
}
如果您真的真的想避免使用 String (不知道为什么),我想您可以使用
multiplier = Math.pow(10,(int)(Math.log10(nbr)+1));
只要数组中的最后一个元素不为 0,它就可以工作。
使用这种方法,只要您的输入对于 int 来说太大,就使用 long。
long r = 0;
for(int i = 0; i < arr.length; i++)
{
int offset = 10;
if(arr[i] >= 10)
offset = 100;
r = r*offset;
r += arr[i];
}
这将检查当前 int 是否大于 10 以将偏移量重置为 100 以获得所需的额外位置。 如果您包含大于 100 的值,您还需要添加额外的偏移量。
由于字符串的所有反对意见,将其放在我的帖子末尾......这是一个完全合法的答案......OP从未要求最有效的方法来做它只是想要一个答案
循环将数组附加到数组中的每个 int 的字符串,然后将字符串解析回 int
String s = "";
for(int i = 0; i < arr.length; i++)
s += "" + arr[i];
int result = Integer.parseInt(s);
根据您的评论,您拥有的数字对于int
来说太长了,您需要使用long
String s = "";
for(int i = 0; i < arr.length; i++)
s += "" + arr[i];
long result = Long.parseLong(s);
如果您可以使用 Java 1.8,流 API 会非常简单:
@Test
public void arrayToNumber() {
int[] array = new int[]{1,2,3,4,5,6};
StringBuilder sb = new StringBuilder();
Arrays.stream(array).forEach(element -> sb.append(element));
assertThat(sb.toString()).isEqualTo("123456");
}
你可以那样做
public static int[] plusOne(int[] digits) {
StringBuilder num= new StringBuilder();
PrimitiveIterator.OfInt primitiveIterator = Arrays.stream(digits)
.iterator();
while (primitiveIterator.hasNext()) {
num.append(primitiveIterator.nextInt());
}
int plusOne=Integer.parseInt(String.valueOf(num))+1;
return Integer.toString(plusOne).chars().map(c -> c-'0').toArray();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.