2016-04-20 10 views
1

Ich habe eine Sammlung mit Objekten, die bestimmte int Feld enthalten.Finden Sie das nächste Objekt in Java-Sammlung

z.

public class Foo { 
    public int field; 
} 

Ich mag würde ein Element erhalten, die am nächsten Wert zu bestimmtem Wert hat (zB. 42).

Gibt es eine saubere Methode von Guava, um so etwas zu erreichen?

Antwort

6

Wenn Sie speziell Guava verwenden möchten, können Sie eine Ordering verwenden können Suchen Sie einfach den Minimalwert gemäß dieser Bestellung:

Foo closest = ordering.min(iterableOfFoos); 

Sie können dies jedoch mit Streams in Java 8 tun, wie von @wero vorgeschlagen.

5

(nicht Guava aber Java-Streams): Verwenden Sie Stream.min und eine benutzerdefinierte Komparator:

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); 
     } 
    }); 

Jetzt können Sie:

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

in Java, könnte man die Sammlung zu seinem Elemente mit dem geringeren Unterschied zu Ihrem Ziel reduzieren:

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