【问题标题】:Is there a way to automatically store integers in an ArrayList using a for loop? [closed]有没有办法使用 for 循环自动将整数存储在 ArrayList 中? [关闭]
【发布时间】:2018-02-10 23:52:33
【问题描述】:

我的主要目标是获得一个由数字的位值组成的数组。 例如:如果用户输入是:35779 我想要这个数组:{3, 5, 7, 7, 9} (用户输入可能会发生变化,范围从 10 到 int 的最大可能值。

(int counter是一个int,表示输入数字有多少个位值。例如:当输入为:38557:counter = 5)

    ArrayList<Integer> obj = new ArrayList<Integer>();

    for(int i = counter-1; i >= 0 ; --i){
        int ten2pow = (int)Math.pow(10, i);
        int x = input/ten2pow;
        obj.add(x);
        input = input - x*ten2pow;
    }

执行此操作并尝试打印数组时,输出为空数组

编辑:更改 for 循环初始化和终止条件后,循环工作得很好,我能够将 Place 值存储在 ArrayList 中

【问题讨论】:

  • 什么是5 &lt;= 1
  • 是否给定了counter?还是需要自己计算?
  • 如果他确实需要计算,那他就做错了。最好从最低有效位开始,一直除以 10,直到没有剩余为止。
  • 尝试在 for(int i = counter -1; i >= 0 ; i--) 的条件下使用它
  • 我个人可能只是让它由正则表达式处理:int[] components = Arrays.stream(Integer.toString(value).split("(?=\\d)")).mapToInt(Integer::parseInt).toArray();

标签: java arrays for-loop arraylist


【解决方案1】:

我猜这个数字是给定的,如果需要从控制台读取,那我就省略了。

假设我们的号码是:35779,那么一个简单的“划分”它的方法可能是:

  1. 获取number的模块10结果
  2. number除以10

例子:

  • 模数:9
  • number: 3577

重复:

  • 模数:7
  • number: 357

所以,可以这样完成:

import java.util.ArrayList;
import java.util.List;

public class NumbersToArray {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        int number = 35779;

        while (number > 0) {
            list.add(0, number % 10);

            number /= 10;
        }

        System.out.println(list);
    }
}

哪些打印:

[3, 5, 7, 7, 9]

因此,无需获取number 的长度

【讨论】:

    【解决方案2】:

    正如 Sotirios Delimanolis 在 cmets 中所暗示的那样,这里的第一个问题是 for 循环条件是错误的。如果i 以大于1 的数字开头,则i &lt;= 1 永远不会为真。此外,如果该语句为真(即i0 或小于0),则增量表达式(i--)将一直运行,直到它下溢到Integer.MAX_VALUE

    Alnitak 还在 cmets 中提到,最好从最低有效数字开始。这遵循div/mod algorithm for base conversion,更传统。

    基本转换的 div/mod 算法通过递归取 ab 来工作,其中 a 是最后一个模的结果操作(从源值开始)并且 b 是要转换到的基础。每次迭代都会通过余数为结果数字提供另一个数字,从右边开始。

    以将 1000 转换为基数 2 为例:

    • 1000 % 2 = 500, R 0 =&gt; ?? ???? ???0
    • 500 % 2 = 250, R 0 =&gt; ?? ???? ??00
    • 250 % 2 = 125, R 0 =&gt; ?? ???? ?000
    • 125 % 2 = 62, R 1 =&gt; ?? ???? 1000
    • 62 % 2 = 31, R 0 =&gt; ?? ???0 1000
    • 31 % 2 = 15, R 1 =&gt; ?? ??10 1000
    • 15 % 2 = 7, R 1 =&gt; ?? ?110 1000
    • 7 % 2 = 3, R 1 =&gt; ?? 1110 1000
    • 3 % 2 = 1, R 1 =&gt; ?1 1110 1000
    • 1 % 2 = 0, R 1 =&gt; 11 1110 1000

    您可以看到如何使用余数来确定结果值。此处使用此算法的代码如下所示:

    ArrayList<Integer> numberList = new ArrayList<Integer>();
    
    int iteratedValue = input;
    do {
        int currentDigit = iteratedValue % 10;
        numberList.add(currentDigit);        
        iteratedValue /= 10;
    } while (iteratedValue > 0);
    
    Collections.reverse(numberList);
    

    do...while 循环用于确保将第一个数字添加到列表中,即使它是 0

    双端队列或其他集合可用于反向添加项目,以替代在末尾反转列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2016-07-24
      • 2023-03-04
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多