通过两个列表迭代条件

时间:2018-03-11 13:26:49

标签: java list

问题:

我有两个按property列表排序,长度不同。我需要创建两个结果列表,其中包含已定义的记录数,并按property排序。循环块中应该有一个条件来验证应该将哪个记录添加到结果列表中。

例如,在date顺序中按DESC属性排序的两个列表:

list1: [{'1', '13:45:55', 'List1Title1'}, {'2', '13:40:50', 'List1Title2'}]

list2: [{'1', '13:50:55', 'List2Title1'}, {'2', '13:35:50', 'List2Title2'}]

对于count = 3,结果应如下所示:

resultList1: [{'1', '13:45:55', 'List1Title1'}, {'2', '13:40:50', 'List1Title2'}]

resultList2: [{'1', '13:50:55', 'List2Title1'}]

我已尝试在已知循环计数的for...的帮助下迭代列表:

List<Tx> list1 = ...;
List<Tx> list2 = ...;
int list1Index = 0;
int list2Index = 0;
for (int i = 0; i < count; i++) {
  if (list1.get(list1Index).getDate() > list2.get(list2Index).getDate()) {
      resultList1.add(list1.get(list1Index));
      ++list1Index;
    } else {
      resultList2.add(list2.get(list2Index));
      ++list2Index;
    }
}

但是,对于列表大小不同甚至是空的情况,此实现不能保存。

是否有可能在没有大量if/elseif块的情况下迭代这两个列表?

2 个答案:

答案 0 :(得分:1)

您可以添加for条件检查列表中是否还有其他元素

for (int i = 0; i < count && i < list1.size() && i < list2.size(); i++) {
    \\ code here
}

再添加两个for循环来处理残羹剩饭

for (int i = 0; i < count && i < list1.size(); i++) {
    resultList1.add(list1.get(list1Index));
    ++list1Index;
}

for (int i = 0; i < count && i < list2.size(); i++) {
    resultList2.add(list2.get(list2Index));
    ++list2Index;
}

只有在剩下任何元素的情况下才会执行这些循环。

答案 1 :(得分:1)

循环直到selected == countlist1list2都已遍历。

在循环中,

  • 如果已遍历list1list2,则只考虑左侧 之一。
  • 如果没有,请比较它们并确定应增加哪个索引。

    int selected = 0;
    
    for (int list1Index = 0, list2Index = 0;
         selected < count && (list1Index < list1.size() || list2Index < list2.size());
         selected++) {
        if (list1Index == list1.size()) {
            resultList2.add(list2.get(list2Index));
            list2Index++;
        } else if (list2Index == list2.size()) {
            resultList1.add(list1.get(list1Index));
            list1Index++;
        } else if (list1.get(list1Index).getDate() > list2.get(list2Index).getDate()) {
            resultList1.add(list1.get(list1Index));
            list1Index++;
        } else {
            resultList2.add(list2.get(list2Index));
            list2Index++;
        }
    }