简体   繁体   English

遍历ArrayList增加值

[英]Iterating over an ArrayList adding values

在此处输入图片说明 Is it possible to iterate over a ArrayList adding not all instances but every 12? 是否可以遍历不是所有实例而是每12个实例添加一个ArrayList? There are many threads on using addAll to add all instances but not sections. 关于使用addAll来添加所有实例而不是部分的线程很多。

I currently have an ArrayList containing hundreds of float values: 我目前有一个包含数百个浮点值的ArrayList:

Snippet: 片段:

120.5, 22.2, 76.2, 64.5, 38.3, 27.1, 149.4, 62.3, 127.9, 79.1, 83.4, 68.3, 61.0, 83.4, 5.4, 83.8, 78.3, 111.8, 104.1, 145.2, 94.3, 20.0, 104.7, 35.9, 68.6, 10.1, 41.1, 82.2, 170.7, 17.2, 122.1, 61.0, 46.3, 101.1, 59.0, 30.0, ...

What I want to do is sum the first 12 instances and put this total in a new ArrayList, sum the next 12 instances, store this into the newly created ArrayList and so on. 我想要做的是将前12个实例求和,然后将总数加到新的ArrayList中,再将下12个实例求和,将其存储到新创建的ArrayList中,依此类推。 There are exactly 996 instances so i should have 83 new values in this new ArrayList (996/12=83). 恰好有996个实例,所以我应该在这个新的ArrayList中有83个新值(996/12 = 83)。

Can this be done? 能做到吗? If so how? 如果可以,怎么办? Here is where I have got to... 这是我必须去的地方...

  // ArrayList that contains the float values shown above

  public MonthData depthValues() {
    ArrayList<Float> rValue = new ArrayList<>();
    for (int i = 0; i<months.size(); i++)
    {
        rValue.add(months.get(i).getDepthMM());
    }
    System.out.println(rValue);
    System.out.println(rValue.size());
    return null;

  }

  //New arrayList im trying to make
  //probably done this wrong, help needed here

  public MonthData depthTotals() {
    ArrayList<Float> depthAdd = new ArrayList<Float>();

  int t = 12;

  for(int i = 0; i<rValue.size(); ++i)
  {
    ??????????????????
  }
  }

Any help will be greatly appreciated I cant seem to find anything on this anywhere as I think the sum of all instances is such a popular topic. 任何帮助将不胜感激,我似乎无法在任何地方找到任何东西,因为我认为所有实例的总和是如此受欢迎。 Its probably a case of iterating properly. 它可能是正确迭代的情况。 In regards to the summing I would have use accumulate in c++, but do not know the equivalent of this in java (if there is one). 关于求和,我将在c ++中使用accumulate ,但不知道java中的等效项(如果有的话)。 Thank you for any advice/assistance in advance! 预先感谢您的任何建议/协助!

MORE CODE: 更多代码:

public class WeatherStation {
  private ArrayList<MonthData> months;
  private ArrayList<MonthData> rValue;
  private ArrayList<MonthData> depthAdd;

MonthData is a model for data being read to this class it consists on a lot of getters.... MonthData是用于读取此类数据的模型,它包含许多吸气剂。

public class MonthData {

  int y;
  int m;
  float h;
  ...


  public MonthData(String data) throws Exception {
    ...
    this.parseData(data);
  }


  void parseData(String csvData) {
    String[] parseResult = csvData.trim().split("\\s+");

    this.setYear(parseResult[0]);
    this.setMonth(parseResult[1]);
    ...


  public String toString() {
    return "y =" + year + ", m =" + month + ",...

  }


  public int getY() {
    return y;
  }

  // followed by lots of getters for: m, h, c, f, r, s, ... 




   public MonthData depthValues() {
    ArrayList<Float> rValue = new ArrayList<>();
    for (int i = 0; i<months.size(); i++)
{
    rValue.add(months.get(i).getDepthMM());
}
System.out.println(rValue);
System.out.println(rValue.size());
return null;

} }

Code recommended: 推荐代码:

 public MonthData depthTotals() {
    ArrayList<Float> depthAdd = new ArrayList<>();
    Iterator<Float> it = rValue.iterator();
    final int MAX = 12;
    while (it.hasNext()){
      float sum = 0f;
      int counter = 1;
      //iterating 12 times
      //still check if there is an element in list
      while (counter < MAX && it.hasNext()){
        sum += it.next();
        counter++;
      }
      depthAdd.add(sum);}
    }

ISSUE: Iterator<Float> it = rValue.iterator(); 问题: Iterator<Float> it = rValue.iterator();

Type mismatch: cannot convert from Iterator<MonthData> to Iterator<Float> 类型不匹配:无法从Iterator<MonthData>转换为Iterator<Float>

The best way to do this is using Iterator and a counter of 12 by using a while . 最好的方法是使用Iterator和使用while12计数器。 Here's an example: 这是一个例子:

List<Float> yourList = ...;
// fill yourList
List<Float> results = new ArrayList<>();
Iterator<Float> it = yourList.iterator();
final int MAX = 12;
while (it.hasNext()) {
    float sum = 0f;
    int counter = 1;
    //iterating 12 times
    //still, check if there's an element in your list
    while (counter <= MAX && it.hasNext()) {
        sum += it.next();
        counter++;
    }
    result.add(sum);
}

I would recommend you use double or Double instead of float as it has around half a trillion times the accuracy. 我建议您使用doubleDouble而不是float,因为它的精度大约是六万亿倍。

You can sum every block of 12 like this 您可以像这样对每12个块求和

public static List<Double> sumBlocks(List<Double> list, int blockSize) {
    List<Double> ret = new ArrayList<>();
    for(int i = 0; i < list.size(); i += blockSize) {
        double sum = 0;
        for(int j = 0, len = Math.min(list.size() - i, blockSize); j < len; j++)
            sum += list.get(i + j);
        ret.add(sum);
    }
    return ret;
}

and call 并打电话

List<Double> sums = sumBlocks(list, 12);

Just to demonstrate yet another way to accomplish this: 只是为了演示实现此目的的另一种方法:

public static List<Double> sumBlocks(List<Double> list, int blockSize) {
    List<Double> result = new ArrayList<>();
    double sum = 0d;
    for (int i = 0; i < list.size(); i++) {
        if (i > 0 && i % blockSize == 0) {
            result.add(sum);
            sum = 0d;
        }
        sum += list.get(i);
    }
    result.add(sum);
    return result;
}

Arraylist objects inherit the sublist(start, end) method from the List class. Arraylist对象从List类继承sublist(start,end)方法。 You can use myList.sublist(i, j) to access the sublist and get your sum. 您可以使用myList.sublist(i,j)访问子列表并获取总和。 From there, it should be just simple arithmetic to get your iteration. 从那里开始,只需简单的算法即可获得迭代。 Inside your for-loop, it should be: myList.sublist(i*12, i*12 + 12). 在for循环内,它应该是:myList.sublist(i * 12,i * 12 + 12)。

//Input list
ArrayList<Float> inputList = new ArrayList<Float>();

ArrayList<Float> result = new ArrayList<Float>();
    int groupSize = 12;
    int offset=0;
    while(offset < inputList.size()) {
        int toIndex = (inputList.size()-offset)>=groupSize? offset+groupSize : inputList.size();
        result.add( listSum(inputList.subList(offset,  toIndex)) );
        offset += groupSize;
    }

Helper method to add items in a list 在列表中添加项目的辅助方法

static float listSum(List<Float> ar) {
    float accumulator = 0f;
    for(float item:ar) {
        accumulator += item;
    }
    return accumulator;
}
Lista<Double> list = // original list
List<Double> ret = new ArrayList<>();

int counter = 0;
double sum = 0; 

for (Double f : list) {
   if (counter == 12) {
       sum = 0;
       counter = 0;
       ret.add(sum);
   }
   sum += f;
   counter++;
}
// if list is not a multiple of 12
if (list.size() % 12 != 0) {
    ret.add(sum);
}
return ret;

try this: 尝试这个:

public float total;

for(int i; i < rValue.Size(); i ++)
{
     total += rValue[i];

if(i%12=0)
  {
     add total to new ArrayList
     total = 0;
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM