在 Java 集合中查找最近的对象
Find closest object in Java collection
我有一个包含某些 int
字段的对象的集合。
例如
public class Foo {
public int field;
}
我想得到一个值最接近特定值的元素(例如42
)。
番石榴有什么巧妙的方法来实现这样的事情吗?
(不是 Guava,而是 Java 流):使用 Stream.min
和自定义比较器:
List<Foo> list = ...
Foo closest42 = list.stream()
.min((f1,f2) -> Math.abs(f1.field - 42) - Math.abs(f2.field - 42)));
如果你特别想使用 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);
但是,您可以按照@wero 的建议使用 Java 8 中的流来执行此操作。
在纯 java 中,您可以将集合缩减为与您的目标差异较小的元素:
myFoos.stream()
.reduce((result, current) ->
Math.abs(42 - current.field) < Math.abs(42 - result.field) ? current : result);
我有一个包含某些 int
字段的对象的集合。
例如
public class Foo {
public int field;
}
我想得到一个值最接近特定值的元素(例如42
)。
番石榴有什么巧妙的方法来实现这样的事情吗?
(不是 Guava,而是 Java 流):使用 Stream.min
和自定义比较器:
List<Foo> list = ...
Foo closest42 = list.stream()
.min((f1,f2) -> Math.abs(f1.field - 42) - Math.abs(f2.field - 42)));
如果你特别想使用 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);
但是,您可以按照@wero 的建议使用 Java 8 中的流来执行此操作。
在纯 java 中,您可以将集合缩减为与您的目标差异较小的元素:
myFoos.stream()
.reduce((result, current) ->
Math.abs(42 - current.field) < Math.abs(42 - result.field) ? current : result);