【问题标题】:Iterate through array, sum and put results in new array遍历数组,求和并将结果放入新数组
【发布时间】:2014-09-23 03:56:23
【问题描述】:

我有一个用整数填充的 arrayList,我需要遍历这个 arrayList,将数字相加直到达到阈值,然后将结果总和放入第二个 arrayList 槽,然后回到我在原始arrayList,不断迭代和求和,直到达到阈值,然后将其放入第二个槽中,依此类推,直到将所有40个原始项求和并放入较小的arrayList。

我曾想过使用两个嵌套循环,但我无法让这两个循环一起工作。

我对 Java 很陌生,不知道该怎么做。任何建议都会有所帮助。

这是我目前所拥有的:

int threshold = 12;
int sumNum = 0;
int j = 0;
int arr1[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
for (int i = 0; i < arr1.length; i++) {
  while (sumNum <= threshold) {
  sumNum += arr[j];
  j++
}//end while

}//end for

【问题讨论】:

    标签: java arrays arraylist iteration


    【解决方案1】:

    实际上,您只需一个循环即可完成此操作。您无需后退,只需原地不动,继续求和。

    public static ArrayList<Integer> sums(ArrayList<Integer> arr, int threshold){
        ArrayList<Integer> sumArr = new ArrayList<Integer>();
        int s = 0;  //Sum thus far, for the current sum
        for(int i : arr){
            s += i;             //Add this element to the current sum
            if(s >= threshold){ //If the current sum has reached/exceeded the threshold
                sumArr.add(s);  //Add it to the sumArray, reset the sum to 0.
                s = 0;
            }
        }
        return sumArr;
    }
    

    您可以毫无问题地将输入参数从 ArrayList 更改为 int[] 或 Integer[]。 for-each 循环万岁!

    使用上述代码:

    public static void main(String[] args){
        ArrayList<Integer> i = new ArrayList<Integer>();
        //create arraylist 1..20
        for(int x = 1; x <= 20; x++){
            i.add(x);
        }
    
        System.out.println(sums(i).toString());
    }
    

    【讨论】:

    • 我会保证这个答案。
    • 注意,这里假定arr 是一个实际的ArrayList,而不是问题中提供的原始数组。
    • 没错,但引用第一句话:“我有一个用整数填充的arrayList...”
    • 鉴于问题的性质,我想说可能会有一些混乱。
    • 似乎很可能。那(array vs ArrayList)是一个单独的问题,在这里和其他地方都有很好的记录。同时,代码可以使用任何一种方式,只需更改第一个参数的类型以适合您的喜好。
    【解决方案2】:
    package com.test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
            int threshold = 12;
            int sumNum = 0;
            int j = 0;
            int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
            List myList = new ArrayList();
    
            for (int i = 0 ; i < arr1.length ; i++) {
                sumNum += i;
                if (sumNum >= threshold) {
                    myList.add(sumNum);
                    sumNum = 0;
                }
            }
    
            for (int a = 0 ; a < myList.size() ; a++) {
                System.out.println(myList.get(a));
            }
        }
    }
    

    输出

    15
    13
    17
    21
    12
    13
    14
    

    【讨论】:

      【解决方案3】:

      这样的事情怎么样:

      /**
       * Sequentially adds numbers found in the source array until the sum >= threshold.
       * <p/>
       * Stores each threshold sum in a separate array to be returned to the caller
       * <p/>
       * Note that if the last sequence of numbers to be summed does not meet the threshold,
       * no threshold sum will be added to the result array
       * 
       * @param numbersToSum The source number list
       * @param threshold The threshold value that determines when to move on to 
       * the next sequence of numbers to sum
       * 
       * @return An array of the calculated threshold sums
       */
      
      public static Integer[] sumWithThreshold(int[] numbersToSum, int threshold)
      {
          List<Integer> thresholdSums = new ArrayList<Integer>();
      
          if (numbersToSum != null)
          {
              int workingSum = 0;
      
              for (int number: numbersToSum)
              {
                  workingSum = workingSum + number;
      
                  if (workingSum >= threshold)
                  {
                      thresholdSums.add(workingSum);
                      workingSum = 0;
                  }
              }
          }
      
          return thresholdSums.toArray(new Integer[thresholdSums.size()]);
      }
      
      public static void main(String[] args)
      {
          int[] testNumbers = 
          {
                  1,2,3,4,5,6,7,8,9,10,
                  11,12,13,14,15,16,17,18,19,20,
                  21,22,23,24,25,26,27,28,29,30,
                  31,32,33,34,35,36,37,38,39,40};
      
          int[] thresholds = {1, 42, 100, 200};
      
          for (int threshold: thresholds)
          {
              System.out.println("Threshold sums for threshold = " + threshold + ":\n" + Arrays.toString(sumWithThreshold(testNumbers, threshold)));
          }
      }
      

      产生以下输出:

      Threshold sums for threshold = 1:
      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]
      Threshold sums for threshold = 42:
      [45, 46, 45, 54, 63, 47, 51, 55, 59, 63, 67, 71, 75, 79]
      Threshold sums for threshold = 100:
      [105, 105, 115, 110, 126, 105, 114]
      Threshold sums for threshold = 200:
      [210, 225, 231]
      

      【讨论】:

        猜你喜欢
        • 2015-07-31
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 2021-03-06
        相关资源
        最近更新 更多