想象以下物体
class Trip {
String name;
int numOfTravellers;
DateMidnight from;
DateMidnight too;
}
我用java编写了一个手动递归过滤和转换方法。不过,我认为使用 Google Guava 可以将其写得更加 Eloquent 。
有人可以帮助我并告诉我如何重写它以使其更具可读性吗?
基本上,此方法的作用是查找相等的条目,并通过更改日期字段组合相等的条目
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;
}
最佳答案
我认为 Guava 在这里没有多大帮助。没有它,您可以改进很多:
创建 TripKey {String name; int numOfTravellers;}
,定义equals
,并使用它来代替您错误命名的 areEqual
。按键将您的旅行分成列表 - 此处 ListMultimap<TripKey, Trip>
可以提供帮助。
对于每个key,按照from
对对应的列表进行排序。尝试将每次旅行与所有后续旅行结合起来。如果合并,则仅重新启动内部循环。这应该比你的解决方案更清晰(更快)......所以我就停在这里。
关于java - 使用 Google Guava 过滤和转换集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19159498/