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

pix*_*xel 2 java collections guava

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

例如.

public class Foo {
    public int field;
}
Run Code Online (Sandbox Code Playgroud)

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

是否有任何来自番石榴的方法来实现这样的事情?

wer*_*ero 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)));
Run Code Online (Sandbox Code Playgroud)


And*_*ner 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);
      }
    });
Run Code Online (Sandbox Code Playgroud)

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

Foo closest = ordering.min(iterableOfFoos);
Run Code Online (Sandbox Code Playgroud)

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


Aar*_*ron 5

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

myFoos.stream()
      .reduce((result, current) -> 
              Math.abs(42 - current.field) < Math.abs(42 - result.field) ? current : result);
Run Code Online (Sandbox Code Playgroud)