我一直在寻找解决问题的方法,我有一个名为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]
答案 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);