将数组分成3个块,然后将它们放入数组数组中?

时间:2019-03-11 17:45:59

标签: java arrays

我一直在寻找解决问题的方法,我有一个名为Foods的{​​{1}}数组,我想分成一个数组数组(foodsArray),所以每个数组都包含3个foods个对象。例如:Food

我已经像现在这样实现了我的问题:

[[Food1, Food2, Food3], [Food4, Food5, Food6]]

当前结果(foodsArray):Food[] foods = new Food[foodData.length]; //loaded in from a file List<Food> foodsArray = new ArrayList<Food>(); for(int i=0;i<foods.length;i+=5){ foodsArray.add(Arrays.copyOfRange(foods, i, Math.min(foods,i+5))); //error is here //Output System.out.println(Arrays.toString(Arrays.copyOfRange(foods, i, Math.min(foods,i+5)))); }

预期结果(foodsArray):

[[Lcom.company.Food;@3c756e4d, [Lcom.company.Food;@7c0e2abd, [Lcom.company.Food;@48eff760, [Lcom.company.Food;@402f32ff]

2 个答案:

答案 0 :(得分:3)

那呢!您只需遍历数组,然后将其中三个添加到列表中,然后在每个三个之后将列表添加到另一个列表中,即可重置初始列表。

ArrayList<ArrayList<Food>> result = new ArrayList<>();
ArrayList<Food> subArray = new ArrayList<>();
for (int i = 0; i < foods.length; i++) {
    subArray.add(foods[i]);
    if (i % 3 == 2) {
        result.add(subArray);
        subArray = new ArrayList<>();
    }
}

又好又简单。正如Nicholas K所建议的,我正在使用List<List<Food>>

答案 1 :(得分:0)

晚了聚会,但这是Java 8解决方案:

Food[][] partition(Food[] foods, int groupSize) {
  return IntStream.range(0, foods.length)
          .boxed()
          .collect(Collectors.groupingBy(index -> index / groupSize))
          .values()
          .stream()
          .map(indices -> indices
                  .stream()
                  .map(index -> foods[index])
                  .toArray(Food[]::new))
          .toArray(Food[][]::new);
}

有效地,partition方法允许将数组划分为任意大小groupSize的组。

如果有问题,可以通过以下方式获得所需结果:

Food[][] result = partition(foods, 3);