日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java for loop_Java for循环执行了两次

發布時間:2024/10/8 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java for loop_Java for循环执行了两次 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我在執行for循環時遇到了一些麻煩.循環被調用兩次.以下是完成工作的代碼:

import java.util.ArrayList;

import java.util.List;

public class PoolItemMapper {

public List mapJsonObjectsToItems(JsonResponse jsonResponse) {

int count = 0;

List itemsList = new ArrayList<>();

List 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:

JSON響應,其中調用foor循環的getItems():

public class JsonResponse {

private String kind;

private String selfLink;

private List items = new ArrayList();

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 getItems() {

return items;

}

public void setItems(List 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> buildTree(JsonResponse jsonResponse) {

List> itemTree = new ArrayList<>();

List mappedItems = new PoolItemMapper().mapJsonObjectsToItems(jsonResponse);

for (Item i : mappedItems) {

TreeNode item = new TreeNode<>(i);

if (i.getSubItems().size() > 0) {

for (Item subItem : i.getSubItems()) {

item.addChild(subItem);

}

}

itemTree.add(item);

}

return itemTree;

}

有人可以解釋為什么這個循環被調用兩次導致每個子項在列表中兩次?

更新

執行此代碼時,我沒有重復項:

List 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方法的簽名,以接受由映射器返回的Items列表.

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java for loop_Java for循环执行了两次的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。