gpt4 book ai didi

Java for 循环执行了两次

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:12 25 4
gpt4 key购买 nike

我在执行 for 循环时遇到了一些麻烦。循环被调用两次。这是完成工作的代码:

import java.util.ArrayList;
import java.util.List;

public class PoolItemMapper {
public List<Item> mapJsonObjectsToItems(JsonResponse jsonResponse) {
int count = 0;
List<Item> itemsList = new ArrayList<>();
List<Item> js = jsonResponse.getItems();
for (Item item : jsonResponse.getItems()) {
itemsList.add(addNormalItemProperties(item, new Item()));
count++;
}
System.out.println("Call count: " + count);
return itemsList;
}

private Item addNormalItemProperties(Item oldItem, Item newItem) {
if(oldItem.getMembersReference().getItems().size() <= 0) {
return oldItem;
} else if (oldItem.getMembersReference().getItems().size() > 0) {
for (SubItem subItem: oldItem.getMembersReference().getItems()) {
oldItem.getSubItems().add(creteNewSubItem(subItem));
}
}
return oldItem;
}

private Item creteNewSubItem(SubItem oldItem) {
Item i = new Item();
i.setDynamicRatio(oldItem.getDynamicRatio());
i.setEphermal(oldItem.getEphermal());
i.setInheritProfile(oldItem.getInheritProfile());
i.setLogging(oldItem.getLogging());
i.setRateLimit(oldItem.getRateLimit());
i.setRatio(oldItem.getRatio());
i.setSession(oldItem.getSession());
i.setAddress(oldItem.getAddress());
i.setName(oldItem.getName());
i.setState(oldItem.getState());

return i;
}

}

列表的大小为 134,因此我收到两次“调用计数 134”的输出。这导致列表中出现重复项。
以下是 POJO:

调用 foor 循环的 getItems() 的 JSON 响应:

public class JsonResponse {
private String kind;
private String selfLink;
private List<Item> items = new ArrayList<Item>();

public JsonResponse() {

}

public String getKind() {
return kind;
}

public void setKind(String kind) {
this.kind = kind;
}

public String getSelfLink() {
return selfLink;
}

public void setSelfLink(String selfLink) {
this.selfLink = selfLink;
}

public List<Item> getItems() {
return items;
}

public void setItems(List<Item> items) {
this.items = items;
}
}

Item 类是一个简单的 DTO,仅包含变量及其 getter/setter:
这里是调用方法的地方:

itemTree = new PoolTreeBuilderImpl().buildTree(j);

itemTree.stream().forEach(i -> {
System.out.println("[PARENT] " + i.getData().toString());
i.getData().getSubItems().stream().forEach(si -> {
System.out.println(" [CHILD] " + si.toString());
});
});

PoolTreeBuilderImpl 调用:

@Override
public List<TreeNode<Item>> buildTree(JsonResponse jsonResponse) {
List<TreeNode<Item>> itemTree = new ArrayList<>();
List<Item> mappedItems = new PoolItemMapper().mapJsonObjectsToItems(jsonResponse);
for (Item i : mappedItems) {
TreeNode<Item> item = new TreeNode<>(i);
if (i.getSubItems().size() > 0) {
for (Item subItem : i.getSubItems()) {
item.addChild(subItem);
}
}
itemTree.add(item);
}
return itemTree;
}

有人能解释一下为什么这个循环被调用两次导致每个子项在列表中出现两次吗?

更新
执行此代码时,我没有重复项:

List<Item> mappedItems = new PoolItemMapper().mapJsonObjectsToItems(jsonResponse);
mappedItems.forEach(i -> {
System.out.println("[PARENT] " + i.toString());
i.getMembersReference().getItems().forEach(s -> {
System.out.println(" [CHILD] " + s.toString());
});
});

最佳答案

问题出在 JsonResponse 对象上,它总是一样的。 JsonResponse 列表中的对象被修改了两次,因此存在重复项。这就是为什么 (@Joakim Danielson) 有第二个参数 newItem
此外,我必须更改 TreeBuilder 的 buildTree 方法的签名以接受 Item 的列表,即映射器返回的列表。

关于Java for 循环执行了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54143616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com