2017-04-22 6 views
-2

Ich werde gebeten, ein Java-Bibliothekmodul zu implementieren, das 1 Methode enthält, die Sammlungen beliebiger Objekte mithilfe einer benutzerdefinierten Filtermethode filtern und den Identitätshashcode des Objekts zurückgeben kann (eindeutiger Hashcode für das generierte Objekt) von der JVM), vorzugsweise unter Verwendung von Java 8-Konstrukten. Wenn mehrere Objekte gefunden werden, sollte das größte zurückgegeben werden. Wenn der Komparator sie nicht eindeutig sortiert, sollte der größte Hash-Code zurückgegeben werden. Die Methode sollte der Signatur folgen, die Sie unten finden können.Java-Sammelfilter-Komparator

public <T> Optional<Integer> getIt(Collection<T> collection, Predicate<T> filter, Comparator<T> comparator) 

So, dachte ich zuerst zu filtern, mit:

collection.removeIf(filter.negate()); 

Aber was ich nicht wird, könnte erhalten, wie Sie das größte beliebige Objekt bekommen?

Jede Hilfe sehr geschätzt wird, dank

Antwort

1

Die Streams API funktioniert die Lösung relativ einfach machen:

public <T> Optional<Integer> getIt(Collection<T> collection, Predicate<T> filter, Comparator<T> comparator) { 
    return collection.stream() 
     .filter(filter) 
     .max(comparator.thenComparingInt(System::identityHashCode)) 
     .map(System::identityHashCode); 
} 

Edit: Ein Kommentator, Mike Nakis, mich darauf hingewiesen, dass diese Frage wahrscheinlich fallen unter die Kategorie "Hausaufgabenhilfe", eine Beobachtung, die ich selbst im ersten Durchgang verpasst habe. Wenn Sie in der Tat Hilfe bei der Klassenarbeit suchen, verwenden Sie bitte die Lösungen in diesem Thread ehrlich. Wie immer müssen Stack-Overflow-Antworten zugeordnet werden, und jeder Code, den Sie eingeben, sollte zumindest einen Link zu dieser Frage enthalten, in dem Sie erklären, dass Sie stecken geblieben sind und um Hilfe gebeten werden.

+0

1. Es ist ethisch fragwürdig, Hausaufgabenfragen mit tatsächlichem Code zu beantworten. 2. Ihre Stream-Lösung ist beeindruckend, aber wenn das OP dies einleitet, wird sein Professor sofort wissen, dass jemand anderes es für ihn geschrieben hat. –

+0

Dann wieder die Frage sagt "vorzugsweise mit Java 8 Konstrukte", so dass die Streams Lösung könnte was erwartet wird. Aber trotzdem ist die Beantwortung von Hausaufgaben mit Code schlecht. –

+0

@MikeNakis Sieht man sich die Frage nochmal an, scheint das ein wenig zu viel wie Hausaufgabenhilfe zu sein. Auf dem ersten Pass sah es nach einer Arbeitgeberanforderung aus, aber ich vermute, dass ich ein bisschen zu schnell gescannt habe. – gyre

1

Sie müssen Ihre gefilterte Sammlung in eine ArrayList setzen und dann darauf die Methode sort() aufrufen, die einen Komparator akzeptiert.

Sie können jedoch den mitgelieferten Vergleicher nicht verwenden, da er Ihre Objekte gemäß der Definition des Problems möglicherweise nicht eindeutig sortiert. Also müssen Sie Ihren eigenen Komparator liefern, der folgendes macht:

Zuerst ruft er den mitgelieferten Komparator auf; Wenn es etwas anderes als Null zurückgibt, geben Sie das Ergebnis zurück. Wenn der zugeführte Vergleicher Null zurückgibt, berechnet man die Identitäts-Hashcodes der beiden Objekte, vergleicht die beiden Hashcodes und gibt das Ergebnis dieses Vergleichs zurück.