在Java集合中查找最近的对象

时间:2016-04-20 09:24:04

标签: java collections guava

我有一个包含某些int字段的对象的集合。

例如

public class Foo {
    public int field;
}

我想获得一个与某个值具有最接近值的元素(例如42)。

番石榴是否有任何巧妙的方法来实现这一目标?

3 个答案:

答案 0 :(得分:7)

(不是Guava,而是Java流):使用Stream.min和自定义比较器:

 List<Foo> list = ...
 Foo closest42 = list.stream()
      .min((f1,f2) -> Math.abs(f1.field - 42) - Math.abs(f2.field - 42)));

答案 1 :(得分:6)

如果您特别想使用Guava,可以使用Ordering

final int target = 42;
Ordering<Foo> ordering = Ordering.natural().onResultOf(
    new Function<Foo, Integer>() {
      @Override public Integer apply(Foo foo) {
        return Math.abs(foo.field - target);
      }
    });

现在您可以根据此顺序找到最小值:

Foo closest = ordering.min(iterableOfFoos);

但是,您可以使用Java 8中的流来执行此操作,如@wero所建议的那样。

答案 2 :(得分:3)

在纯java中,您可以将集合减少到其元素,与目标的差别较小:

myFoos.stream()
      .reduce((result, current) -> 
              Math.abs(42 - current.field) < Math.abs(42 - result.field) ? current : result);