整数ArrayList如何转换为一个整数?

7
什么是将整数的ArrayList转换为一个int的最简单方法,在Java中,使列表中的第一个整数成为int中的第一个数字,等等。
例如,一个包含Integers的ArrayList:1 4 6 7 8 3 8 变成int值1467838。

有特定的编程语言吗? - dsteele
哇,这个问题一下子得到了10个答案。 - Alex Beardsley
1
在像 List<Integer> list = Arrays.asList(5,6,7,8,9,10,11,12,13,14,15,16,17); 这样的情况下,行为是否应该被指定? - Tetsujin no Oni
@Tetsujin no Oni:我不这么认为。他想要的似乎是将整数列表组合在一起,使每个整数成为数字的一部分。就像示例中,列表组合成为最终整数的数字。 - Alex Beardsley
10个回答

22

在Java中最简单的方法是:

int total = 0;
for (Integer i : list) { // assuming list is of type List<Integer>
    total = 10*total + i;
}
例如,如果列表包含1 4 6 7 8 3 8,那么您会得到:
  • total = 0
  • total = 10*0 + 1 = 1
  • total = 10*1 + 4 = 14
  • total = 10*14 + 6 = 146
  • ...
  • total = 10*146783 + 8 = 1467838
这是正确答案。

这是Java答案中最好的之一。对我来说,将其转换为字符串,然后再转换回整数不仅效率低下,而且也很复杂。 - Clint Miller
说实话,在Java中,如果你不关心它的效率,那么它并不是很糟糕,因为所有的转换都是由本地代码运行的。虽然我肯定会承认这不是最好的方法。 - Alex Beardsley
2
这会导致列表中任何大于9的整数出现错误。我没有在问题中看到这个限制,但是OP将您标记为最佳答案表明列表中的所有整数都保证小于等于9。 - Matt K
是的,我理解这个问题的意思是列表是由数字组成的。如果列表中有多位数的数字,那么程序会默默地出错。 - Michael Myers
1
如果你的列表超过10位数字,那么是的,这会引起问题。即使是“longs”也最多只能达到19位数字。 - Michael Myers
显示剩余2条评论

5
注意:最简单的不一定是最高效的。由于您没有指定语言,因此以下示例使用Java,但您可以采用类似以下代码的方式进行实现:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(6);

for (Integer x : list) {
    s += x.toString();
}

Integer finalResult = Integer.parseInt(s);

编辑: 针对评论中提到的所有人,如果您真的担心效率问题,但由于某些原因想使用此字符串方法,则应按以下方式执行:

StringBuilder sb = new StringBuilder();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(6);

String s;

for (Integer x : list) {
    sb.append(x.toString());
}

Integer finalResult = Integer.parseInt(sb.toString());

在第一个例子中,为了简单起见没有使用StringBuilder,因为这看起来像是一项作业任务。

非常感谢!非常有帮助,虽然问题很基础,但还是很抱歉。 - Meg
在我被批评成为被接受的答案之前,我要首先承认有更快的解决方案存在。但对于初学者来说,这似乎是最简单易懂的。 - Alex Beardsley
@Meg 没问题。只要记住,虽然你可能不会注意到速度上的差异(即过早优化),但以下使用数学方法的答案很可能会更快。 - Alex Beardsley
1
你不仅在使用字符串操作,还在循环中使用+=。这几乎是如何做的教科书范例--但它确实回答了问题,并且无法知道它是否会成为瓶颈。 - Michael Myers
@mmyers,我有点不好意思地说,我从来没有注意到StringBuilder的这一点,也就是它会自动进行String.valueOf转换。非常酷。 - Alex Beardsley
显示剩余6条评论

4
假设您使用的是C#(因为您没有指定),但是通用算法在任何需要的语言中都可以工作:
假设您使用的是C#(因为您没有指定),但是通用算法在任何需要的语言中都可以工作:
int num = 0;
for( int i = 0 ; i < list.Count ; i++ ) 
{
    num *= 10;
    num += (int)list[i];
}

显然,该代码假定生成的数字足够小,可以用int表示,并且您的ArrayList中的每个项目都在0到9之间(包括0和9)。

1

另一种解决方案,它将接受大于9的数字

List<Integer> list = 
int num = Integer.parseInt(list.toString().replaceAll("\\D",""));

1

只能处理不超过20亿的数字。如果您需要更大的数字,请使用long、long-long或您喜欢的bigint类。除非所有数字都是负数,否则无法处理负数。

int runningtotal = 0;
foreach(int i in myList) {
    runningtotal *= 10;
    runningtotal += i;
}
return runningtotal;

0
int result = 0;
for(int i=list.Count - 1;i>=0;--i)
{
  result += list[i] * (int)(Math.Pow((double)10, (double)(list.Count - 1 - i)));
}

同样也不能处理负数……你可以使用 Math.Abs() 来解决这个问题。


0
在 Haskell 中,
listToNumber = foldl (\a b -> a*10 + b) 0

在Python中,

def list_to_number(some_list):
    return reduce(lambda x, y: x*10 + y, some_list, 0)

在问题指定语言之前发布。 - Clint Miller
此外,Haskell 代码可以更加简洁,可以被简化为 foldl ((+) . (*) 10) 0。 - Clint Miller

0

如果不知道你想要用哪种编程语言,我认为最好的方法是找出1000000 + 400000 + 60000 + 7000 + 800 + 30 + 8的总和。


0
我假设您的问题意思是ArrayList的索引0是最重要的值。您的示例显示第一个数字相当于1,000,000。
您可以将它们视为字符,然后连接它们,然后解析回整数。
或者您可以将每个项添加到结果中,然后将结果乘以十来设置数量级。
或者您可以将每个元素的值*10^(count-index)相加;其中计数是ArrayList中元素的数量。

0
在Python中,只是为了好玩:
i = int("".join([str(z) for z in x]))

糟糕,这是在你指定语言之前。你说ArrayList,所以我假设是Java,但我太喜欢Python了。 - Robbie
没关系 :-) 如果我以后写Python代码,我会记得的。 - Meg

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