java - 使用 Google Guava 过滤和转换集合

标签 java collections guava jodatime

想象以下物体

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/

相关文章:

c# - .NET XML 序列化和空集合

java - 应用程序未在 websphere 8.5.5 中启动,但在 tomcat 中运行良好

java - 嵌套 while 循环迭代

Java 调试困惑

java - 使用 Spring RestTemplate 和 Jackson 进行多部分文件上传

用于特殊滚动、循环队列的 Java Collection

java - 优化:通过java中的集合进行双重循环

java - GraphView : rotating horizontal date labels, 指定视口(viewport)的固定大小并将项目符号点与日期标签对齐

guava - 从java8流创建guava MultiMap的最干净方法

java - Guava MapMaker 可以选择为工厂方法设置 MaximumSize(0) 吗?