有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何复制ArrayList的一部分,更改并添加到同一ArrayList?

我将创建一个ArrayList,向其中添加5个元素

// This is just an example
var rectangles = new ArrayList<>(20) {
    {
        add(new Rectangle(10, 10, Color.RED));
        add(new Rectangle(20, 20, Color.GREEN));
        add(new Rectangle(30, 30, Color.YELLOW));
        add(new Rectangle(40, 40, Color.BLUE));
        add(new Rectangle(50, 50, Color.PURPLE));
    }
};

其余15个元素不需要编写,因为前五个元素只会重复,但每五个元素都有一个特定的属性集

最好在代码上看到它

for (var angle = 90; angle <= 270; angle += 90) {
    var part_of_array = rectangles.subList(0, 5);
    var rotate = new Rotate(angle, 500, 500);
    part_of_array.stream().forEach(t -> ((Rectangle) t).getTransforms().add(rotate));  
    rectangles.addAll(part_of_array);
}

但代码很复杂,最重要的是,根本不起作用。因此,阵列有20个元素,但它们的角度都设置为90

请问如何正确书写

多谢各位


共 (2) 个答案

  1. # 1 楼答案

    我会使用流来完成这项工作:

    备选案文1:

    List<Rectangle> rectangles = Stream.of(new Rectangle(10, 10, Color.RED),
                                            new Rectangle(20, 20, Color.GREEN),
                                            new Rectangle(30, 30, Color.YELLOW),
                                            new Rectangle(40, 40, Color.BLUE),
                                            new Rectangle(50, 50, Color.PURPLE))
        .flatMap(rectangle -> 
                IntStream.range(0, 4).mapToObj(i -> {
                    var newRectangle = new Rectangle(rectangle.getWidth(), rectangle.getHeight(), rectangle.getFill());
                    newRectangle.getTransforms().add(new Rotate(90 * i, 500, 500));
                    return newRectangle;
                }))
        .collect(Collectors.toList());
    

    备选案文2:

    假设矩形是正方形(高度=宽度),您还可以执行以下操作:

    Map<Integer, Color> map = Map.of(10, Color.RED, 20, Color.GREEN, 30, Color.YELLOW, 40, Color.BLUE, 50, Color.PURPLE);
    
    List<Rectangle> rectangles = map.entrySet().stream()
        .flatMap(entry -> IntStream.range(0, 4).mapToObj(i -> {
                Rectangle rectangle = new Rectangle(entry.getKey(), entry.getKey(), entry.getValue());
                rectangle.getTransforms().add(new Rotate(90 * i, 500, 500));
                return rectangle;
            }))
        .collect(Collectors.toList());
    

    更新

    备选案文1:

    为了保持顺序,您需要使用比较器并反转流

    List<Rectangle> rectangles = IntStream.range(0, 4).boxed()
        .flatMap(i -> 
            Stream.of(new Rectangle(10, 10, Color.RED),
                        new Rectangle(20, 20, Color.GREEN),
                        new Rectangle(30, 30, Color.YELLOW),
                        new Rectangle(40, 40, Color.BLUE),
                        new Rectangle(50, 50, Color.PURPLE))
            .sorted(Comparator.comparingDouble(Rectangle::getWidth))
            .map(rectangle -> {
                var newRectangle = new Rectangle(rectangle.getWidth(), rectangle.getHeight(), rectangle.getFill());
                newRectangle.getTransforms().add(new Rotate(90 * i, 500, 500));
                return newRectangle;
            }))
        .collect(Collectors.toList());
    

    备选案文2:

    要保持顺序,需要使用树形图并反转流

    Map<Integer, Color> map = Map.of(10, Color.RED, 20, Color.GREEN, 30, Color.YELLOW, 40, Color.BLUE, 50, Color.PURPLE);
    
    Map<Integer, Color> treeMap = new TreeMap<>(map);
    
    List<Rectangle> rectangles = IntStream.range(0, 4).boxed()
        .flatMap(i -> 
            treeMap.entrySet().stream().map(entry -> {
                    Rectangle rectangle = new Rectangle(entry.getKey(), entry.getKey(), entry.getValue());
                    rectangle.getTransforms().add(new Rotate(90 * i, 500, 500));
                    return rectangle;
            }))
        .collect(Collectors.toList());
    
  2. # 2 楼答案

    您需要从子列表创建一个新列表,以避免更改初始列表,并且需要克隆每个矩形:

    var part_of_array = new ArrayList<Rectangle>(rectangles.subList(0, 5));
    var rotate = new Rotate(angle, 500, 500);
    part_of_array.stream().forEach(t -> ((Rectangle) t.clone()).getTransforms().add(rotate));  
    rectangles.addAll(part_of_array);