2013-10-31 54 views
0

我不知道如何解决这个问题。循环中的逻辑错误导致不需要的输出

List<Temporary> getTemporaryList = getTemporary(); 
     Map<Integer, Set<Attribute>> attributeOrderMap = attributeOrderMap(getTemporaryList); 
     Map<Integer, Set<OrderSample>> sampleOrderMap = sampleOrderMap(getTemporaryList); 

     Set<OrderSample> temporaryOrderSampleSet = Sets.newHashSet(); 
     java.util.ListIterator<Order> it = orders.listIterator(); 
     List<Order> finalOrder = Lists.newArrayList(); 

for (Order order : orders) { 
     temporaryOrderSampleSet.clear(); 
     if (sampleOrderMap.containsKey((order.getId()))) { 
      Set<OrderSample> samples = sampleOrderMap.get(order.getId()); 

      for (OrderSample orderSample : samples) { 
       Set<Attribute> attributes = attributeOrderMap.get(order.getId()); 
       orderSample.setAttributes(attributes); 
       temporaryOrderSampleSet.add(orderSample); 
       order.setSample(temporaryOrderSampleSet); 
       finalOrder.add(order); 
      } 
     } 
     } 

我有一个订单列表。 1000个订单。我有一组样本和一组属性。对于第一个属性,我想把它放在第一个样本,然后把它放在第一个顺序。然后对第二个属性也是一样,把它放在第二个样本中,然后把样本放在第二个样本中。

所以我的名单看起来像下面

ATTRIBUTE1 - > SAMPLE1 - > Order1

Attribute2 - > SAMPLE2 - > Order2

Attribute3 - >样品3 - > Order3

Attribute4 - > sample4 - > Order4

我当前的代码保持连连加样本。所以我的第一个名单开始很小,然后我的第二个名单更大,因为它包含了第一名单和第二名单中的所有内容,然后第三名更大等等。我被卡住了,不知道该怎么办。

+0

看来你想在'for(OrderSample orderSample:samples)'循环中说'temporaryOrderSampleSet.clear();'? – devnull

回答

1

您需要在for循环内创建一个新的temporaryOrderSampleSet

for (Order order : orders) { 
     Set<OrderSample> temporaryOrderSampleSet = Sets.newHashSet(); 
     if (sampleOrderMap.containsKey((order.getId()))) { 

否则,你把相同列表一遍又一遍,并且清除它,这样只有最后一次迭代中设置它的价值。

另一个问题:

order.setSample(temporaryOrderSampleSet); 

可以在外面的内for循环设置。在你的代码中,你只需重复一遍又一遍的值。

+0

所以我会在循环内部声明temporaryOrderSampleSet,而不是在循环之外? – user2811419

+0

是的。这样每个订单都会得到它自己的**样品。 – BobTheBuilder

+0

它没有工作 – user2811419