如何基于Java中的公共属性合并两个排序的对象列表

时间:2017-07-09 12:30:51

标签: java android object merge

我有两个对象列表,它们都有一个名为timestamp的公共属性,并且都按时间戳排序。

我想基于时间戳逐个广播这些对象,例如,如果第一列表的第一个对象具有时间戳<第二个列表的第一个对象,广播第一个列表的第一个对象,然后将第一个列表的第二个对象与第二个列表的第一个对象进行比较。

我是java的新手。这就是我想出的:

$("#whatever_footer_id").css("display":"none");

我知道我的逻辑是不正确的,因为对于迭代器中的第一项,xIterator.previous和yIterator.previous将指向什么。我似乎找不到这个问题陈述的正确解决方案。请帮忙。

3 个答案:

答案 0 :(得分:1)

使用索引而不是迭代器。您还可以使用方法来防止代码冗余

int xIndex = 0;
int yIndex = 0;

while (xIndex < list1.size() && yIndex < list2.size()) {
    if (list1[xIndex].timestamp <= list2[yIndex].timestamp) {
        broadcast(list1, xIndex);
        ++xIndex;
    }
    else {
        broadcast(list2, yIndex);
        ++yIndex;
    }
}

dealWithLeftovers(list1, xIndex);
dealWithLeftovers(list2, yIndex);

broadcast

private void broadcast(List<> list, int index) {
    Bundle extra = new Bundle();
    extra.putParcelable(LocalBroadcastConstants.ACTION, list[index]);
    MyBroadcastManager.getInstance(getTargetContext()).sendBroadcast(
        new Intent(LocalBroadcastConstants.ACTION_SEND).putExtras(extra)
    );
}

dealWithLeftovers

private void dealWithLeftovers(List<> list, int index) {
    for (int i = index; i < list.size() ; ++i) {
        broadcast(list, i);
    }
}

答案 1 :(得分:0)

一个简单但易于实施的解决方案:

  • 创建一个只包含两个列表中所有对象的列表
  • 创建一个比较器,它知道如何从不同的类中提取时间戳 - 然后比较它们
  • 使用Collections .sort()使用该比较器对合并列表进行排序

就是这样。现在,您按顺序将已排序的列表循环到广播对象。

答案 2 :(得分:0)

如果要将两个列表与排序合并到其中一个字段,下面的示例可能会对您有所帮助。使用Java8 Streams

Obj p1 = new Obj();
    p1.setDept("EC");
    p1.setName("Sagar");
    p1.setJoinedDate(new Date(2007, 8, 2));

    Obj p2 = new Obj();
    p2.setDept("EE");
    p2.setName("Rang");
    p2.setJoinedDate(new Date(2007, 8, 3));

    Obj p3 = new Obj();
    p3.setDept("ME");
    p3.setName("Avadh");
    p3.setJoinedDate(new Date(2008, 8, 2));

    Obj p4 = new Obj();
    p4.setDept("IP");
    p4.setName("Pams");
    p4.setJoinedDate(new Date(2007, 8, 1));

    List<Obj> dept1 = new ArrayList<>();
    dept1.add(p1);
    dept1.add(p2);

    List<Obj> dept2 = new ArrayList<>();
    dept2.add(p3);
    dept2.add(p4);
    dept1.addAll(dept2);
    List<Obj> sortedList = dept1.stream().sorted(new Comparator<Obj>() {

        @Override
        public int compare(Obj o1, Obj o2) {
            if(Instant.ofEpochMilli(o1.getJoinedDate().getTime()).atZone(ZoneId.systemDefault())
            .toLocalDateTime().isBefore(Instant.ofEpochMilli(o2.getJoinedDate().getTime()).atZone(ZoneId.systemDefault())
            .toLocalDateTime())){
                return -1;
            }else if(Instant.ofEpochMilli(o1.getJoinedDate().getTime()).atZone(ZoneId.systemDefault())
                    .toLocalDateTime().isAfter(Instant.ofEpochMilli(o2.getJoinedDate().getTime()).atZone(ZoneId.systemDefault())
                            .toLocalDateTime())){
                return 1;
            }
            return 0;
        }
    }).collect(Collectors.toList());

    System.out.println(sortedList);