0

想象以下对象

class Trip {
  String name;
  int numOfTravellers;
  DateMidnight from;
  DateMidnight too;
}

我在java中编写了一个手动递归过滤器和转换方法。但是,我认为这可以用 Google Guava 来写得更有说服力。

有人可以帮助我并告诉我如何重写它以使其更具可读性吗?

基本上,此方法的作用是找到相等的条目,并通过更改日期字段来组合相等的条目

List<Trip> combineEqual(List<Trip> list) {
        int n = list.size() - 1;
        for (int i = n; i >= 0; i--) {
            for (int j = n; j >= 0; j--) {
                if (i == j) {
                    continue;
                }
                if (shouldCombineEqual(list.get(i), list.get(j))) {
                    Trip combined = combine(list.get(i), list.get(j));
                    list.remove(i);
                    list.remove(j);
                    list.add(Math.min(i, j), combined);
                    return combineEqual(liste);
                }
            }
        }
        return list;
    }


private boolean shouldCombineEqual(Trip a, Trip b) {
    return shouldCombineWith(a, b) || shouldCombineWith(b, a);
}

private boolean shouldCombineWith(Trip a, Trip b) {
    return a.too() != null
            && a.too().plusDays(1).equals(b.from)
            && areEqual(a, b);
}

private boolean areEqual(Trip a, Trip b) {
    return equal(a.name,b.name) && equal(a.numOfTravellers, b.numOfTravellers);
}

private boolean equal(Object a, Object b) {
    return a == null && b == null || a != null && a.equals(b);
}

private Trip combineEqual(Trip a, Trip b) {
    Trip copy = copy(a); //Just a copy method
    if (a.from.isAfter(b.from)) {
        Trip tmp = a;
        a = b;
        b = tmp;
    } // a is now the one with the earliest too date
    copy.from = a.from;
    copy.too = b.too;
    return copy;
}
4

2 回答 2

2

我认为番石榴在这里帮不上什么忙。没有它你可以改进很多:

创建TripKey {String name; int numOfTravellers;}、定义equals和使用它,而不是您的错误名称areEqual。按他们的键将您的旅行分成列表 - 这里ListMultimap<TripKey, Trip>可以提供帮助。

对于每个键,根据 对对应的列表进行排序from。尝试将每次旅行与所有后续旅行结合起来。如果它被合并,则仅重新启动内部循环。这应该已经比您的解决方案更清晰(更快)了......所以我停在这里。

于 2013-10-03T16:20:42.307 回答
2

我只是使用一个HashSet。

首先在您的行程对象中定义equals 和hashcode。将第一个列表添加到集合中。然后遍历第二个列表,检查匹配的行程是否已经在集合中。就像是:

    public static Set<Trip> combineEquals(List<Trip> 11, List<Trip> 12) {
    Set<Trip> trips = new HashSet<>(11);
    for ( Trip t: 12) {
        if ( trips.contains(t)) {
            // combine whats in the set with t
        } else {
            trips.add(t);
        }
    }

    return trips;
于 2013-10-03T19:28:38.703 回答