![](/img/trans.png)
[英]Java - How to split array on each iteration and pass into a function efficiently?
[英]java how to split an object to multiple objects inside an array efficiently
我是 Java 新手,所以请原谅我解释/说出这个问题的方式。
问题:你周末买了几串水果。 创建一个 java 函数,将一堆拆分为数组内的单个对象。
example input: [{name: "grapes", quantity: 2}]
expected output: [{name: "grapes", quantity: 1}, {name: "grapes", quantity: 1}]
另一个示例输入和预期输出:
example input:
[{name: "currants", quantity: 1},
{name: "grapes", quantity: 2},
{name: "bananas", quantity: 2}]
expected output:
[{name: "currants", quantity: 1},
{name: "grapes", quantity: 1},
{name: "grapes", quantity: 1},
{name: "bananas", quantity: 1},
{name: "bananas", quantity: 1}]
因为我不知道你到底想做什么,所以我很快写了几行代码,就像“概念证明”一样。
当然,这可能不是你想要的,或者你应该做的。 但是根据您提供的信息,这可能是您的解决方案。
public class FruitArry {
public static void main (String [] args){
ShoppedFruits grapes = new ShoppedFruits("grapes",2);
System.out.println(Arrays.toString(getFruitsAsArray(grapes)));
}
public static String[] getFruitsAsArray(ShoppedFruits shoppedFruits){
String[] returnArray = new String[shoppedFruits.quantity];
for(int i = 0 ; i < shoppedFruits.quantity; i++){
returnArray[i] = shoppedFruits.toString();
}
return returnArray;
}
public static class ShoppedFruits {
String name;
int quantity;
public ShoppedFruits(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
@Override
public String toString() {
return "name:"+ name +" quantity: 1";
}
}
}
输出:
[name:grapes quantity: 1, name:grapes quantity: 1]
假设类Fruit
具有带有全参数构造函数和 getter 的适当字段:
final List<Fruit> fruits = List.of(
new Fruit("currants", 1),
new Fruit("grapes", 2),
new Fruit("bananas", 2)
);
您可以产生无限的“单项数量”( 1, 1, 1...
)流,受水果类型limit(fruit.getQuantity())
的实际计数限制,并将“单项数量”映射为1
使用mapToObj
进入新实例。 当您从单个Fruit
获取Stream<Fruit>
时,应使用flatMap
对整个结构进行平面映射:
final List<Fruit> expanded = fruits.stream()
.flatMap(fruit -> IntStream.generate(() -> 1)
.mapToObj(i -> new Fruit(fruit.getName(), i))
.limit(fruit.getQuantity()))
.collect(Collectors.toList());
或者使用IntStream.range
限制创建流:
final List<Fruit> expanded = fruits.stream()
.flatMap(fruit -> IntStream.range(0, fruit.getQuantity())
.mapToObj(i -> new Fruit(fruit.getName(), 1)))
.collect(Collectors.toList());
这两种解决方案都会导致:
expanded.forEach(System.out::println);
Fruit[name='currants', quantity=1] Fruit[name='grapes', quantity=1] Fruit[name='grapes', quantity=1] Fruit[name='bananas', quantity=1] Fruit[name='bananas', quantity=1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.