[英]Java for loop executed twice
I am experiencing some troubles when executing a for loop. 我在执行for循环时遇到一些麻烦。 The loop is called twice.
该循环被调用两次。 Here is the code that does the work:
这是完成工作的代码:
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;
}
}
The list has a size of 134, so I receive an output of two times 'Call count 134'. 该列表的大小为134,因此我收到的输出是“呼叫计数134”的两倍。 This results in having duplicates in the list.
这导致列表中有重复项。
Here are the POJOs: 以下是POJO:
JSON response where getItems()
for the foor loop is called: JSON响应,其中用于foor循环的
getItems()
称为:
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;
}
}
The Item
class is a simple DTO, containing only variables and their getters/setters: Item
类是一个简单的DTO,仅包含变量及其获取器/设置器:
Here is where the method is invoked: 这是调用方法的地方:
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());
});
});
} }
and the PoolTreeBuilderImpl
calls: 和
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;
}
Could someone explain me why this loop is called twice resulting in having each subitem twice in the list? 有人可以解释一下为什么这个循环被调用两次,导致每个子项在列表中两次吗?
Update 更新资料
When executing this code, I don't have the duplicates: 执行此代码时,我没有重复的代码:
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());
});
});
The problem lies in the JsonResponse
object, which is always the same. 问题出在
JsonResponse
对象上,该对象始终是相同的。 The objects within the JsonResponse list are modified twice, so there are duplicates. JsonResponse列表中的对象被修改了两次,因此存在重复项。 That is why (@Joakim Danielson) there is the second parameter
newItem
. 这就是为什么(@Joakim Danielson)有第二个参数
newItem
。
Additionally I had to change the signature of the buildTree
method of the TreeBuilder to accept a list of Item
s, the one returned by the mapper. 另外,我不得不更改TreeBuilder的
buildTree
方法的签名以接受Item
的列表,该列表由映射器返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.