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

Java 如何复制ArrayList的一部分,更改并添加到同一ArrayList?,java,javafx,arraylist,Java,Javafx,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));

我将创建一个
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));
    }
};
//这只是一个例子
var矩形=新阵列列表(20){
{
添加(新矩形(10,10,颜色为红色));
添加(新矩形(20,20,颜色为绿色));
添加(新矩形(30,30,颜色为黄色));
添加(新矩形(40,40,Color.BLUE));
添加(新矩形(50,50,颜色为紫色));
}
};
其余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);
}
for(var angle=90;angle((矩形)t).getTransforms().add(rotate));
矩形.addAll(数组的部分);
}
但代码很复杂,最重要的是,根本不起作用。因此,阵列有20个元素,但它们的角度都设置为90

请问如何正确书写


谢谢

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

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);
var part_of_array=newarraylist(矩形.子列表(0,5));
var rotate=新旋转(角度,500);
_array.stream().forEach(t->((矩形)t.clone()).getTransforms().add(rotate))的第_部分;
矩形.addAll(数组的部分);

我会将流用于该作业:

备选案文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());
List rectangles=Stream.of(新矩形(10,10,Color.RED),
新矩形(20,20,颜色。绿色),
新矩形(30,30,颜色。黄色),
新矩形(40,40,颜色。蓝色),
新矩形(50,50,颜色。紫色))
.flatMap(矩形->
IntStream.range(0,4).mapToObj(i->{
var newRectangle=新矩形(Rectangle.getWidth()、Rectangle.getHeight()、Rectangle.getFill());
newRectangle.getTransforms().add(新的旋转(90*i,500500));
返回新矩形;
}))
.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());
Map Map=Map.of(10,Color.RED,20,Color.GREEN,30,Color.YELLOW,40,Color.BLUE,50,Color.PURPLE);
列表矩形=map.entrySet().stream()
.flatMap(entry->IntStream.range(0,4).mapToObj(i->{
矩形矩形=新矩形(entry.getKey(),entry.getKey(),entry.getValue());
rectangle.getTransforms();
返回矩形;
}))
.collect(Collectors.toList());
更新

备选案文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());
为了保持顺序,您需要使用比较器并反转流

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());
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());
List矩形=IntStream.range(0,4).boxed()
.flatMap(i->
流(新矩形(10,10,颜色为红色),
新矩形(20,20,颜色。绿色),
新矩形(30,30,颜色。黄色),
新矩形(40,40,颜色。蓝色),
新矩形(50,50,颜色。紫色))
.sorted(Comparator.comparingDouble(矩形::getWidth))
.map(矩形->{
var newRectangle=新矩形(Rectangle.getWidth()、Rectangle.getHeight()、Rectangle.getFill());
newRectangle.getTransforms().add(新的旋转(90*i,500500));
返回新矩形;
}))
.collect(Collectors.toList());
备选案文2:

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

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());
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());
Map Map=Map.of(10,Color.RED,20,Color.GREEN,30,Color.YELLOW,40,Color.BLUE,50,Color.PURPLE);
Map treeMap=新的treeMap(Map);
列表矩形=IntStream.range(0,4).boxed()
.flatMap(i->
treeMap.entrySet().stream().map(条目->{
矩形矩形=新矩形(entry.getKey(),entry.getKey(),entry.getValue());
rectangle.getTransforms();
返回矩形;
}))
.collect(Collectors.toList());

getTransforms()和add()做什么?可能是共享矩形类抱歉,这是一个add()正在向arraylist添加元素,并返回ObservableList,您可以在其中添加对象的各种变换-平移、缩放和旋转。您很可能是在将引用复制到相同的对象。问题是,所有元素都始终处于调整状态。虽然我不明白为什么角度是90而不是270。这就是为什么我想知道如何复制它来避免它。我知道有不同的复制方法,但我从未使用过。你只是在循环的每次迭代中重复设置相同矩形的
rotate
属性,这样它们就只设置了最后一个值。如果希望列表中的元素具有不同的旋转值,则不能重用相同的对象,需要创建新的
矩形。删除了我的评论,因为它们没有帮助。谢谢。就像我说的,这只是一个例子。不幸的是,元素的顺序不正确。我希望元素被重复,但是按照当前的顺序-1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5。但是,您的代码将创建-1,1,1,2,2,2,3,3,3,4,4,4,5,5。请问有没有办法调整它以适应这样的结果?谢谢你,当然可以。为此,您需要一个树形图并反转流。我更新了答案,加入了这个,这正是我想要的。就在现在。谢谢对不起,还有一个问题。您将如何编辑第一个代码流。的。。。这样排序也正确了?谢谢你,Yoda666,我更新了答案,包括了两种选择。