繁体   English   中英

java如何有效地将一个对象拆分为数组内的多个对象

[英]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.

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