Es ist mir gelungen, eine Lösung mit Java 8 Streams API zu schreiben, die zuerst eine Liste von Objekt Route nach ihrem Wert gruppiert und dann die Anzahl der Objekte zählt Gruppe. Es wird ein Mapping Route -> Long zurückgegeben. Hier ist der Code:Gruppierung nach Objektwert, Zählung und dann Einstellung des Gruppenschlüssels nach Objektattribut
Map<Route, Long> routesCounted = routes.stream()
.collect(Collectors.groupingBy(gr -> gr, Collectors.counting()));
und die Route Klasse:
public class Route implements Comparable<Route> {
private long lastUpdated;
private Cell startCell;
private Cell endCell;
private int dropOffSize;
public Route(Cell startCell, Cell endCell, long lastUpdated) {
this.startCell = startCell;
this.endCell = endCell;
this.lastUpdated = lastUpdated;
}
public long getLastUpdated() {
return this.lastUpdated;
}
public void setLastUpdated(long lastUpdated) {
this.lastUpdated = lastUpdated;
}
public Cell getStartCell() {
return startCell;
}
public void setStartCell(Cell startCell) {
this.startCell = startCell;
}
public Cell getEndCell() {
return endCell;
}
public void setEndCell(Cell endCell) {
this.endCell = endCell;
}
public int getDropOffSize() {
return this.dropOffSize;
}
public void setDropOffSize(int dropOffSize) {
this.dropOffSize = dropOffSize;
}
@Override
/**
* Compute hash code by using Apache Commons Lang HashCodeBuilder.
*/
public int hashCode() {
return new HashCodeBuilder(43, 59)
.append(this.startCell)
.append(this.endCell)
.toHashCode();
}
@Override
/**
* Compute equals by using Apache Commons Lang EqualsBuilder.
*/
public boolean equals(Object obj) {
if (!(obj instanceof Route))
return false;
if (obj == this)
return true;
Route route = (Route) obj;
return new EqualsBuilder()
.append(this.startCell, route.startCell)
.append(this.endCell, route.endCell)
.isEquals();
}
@Override
public int compareTo(Route route) {
if (this.dropOffSize < route.dropOffSize)
return -1;
else if (this.dropOffSize > route.dropOffSize)
return 1;
else {
// if contains drop off timestamps, order by last timestamp in drop off
// the highest timestamp has preceding
if (this.lastUpdated < route.lastUpdated)
return -1;
else if (this.lastUpdated > route.lastUpdated)
return 1;
else
return 0;
}
}
}
Was Ich mag würde zusätzlich zu erreichen, ist, dass der Schlüssel für jede Gruppe die mit dem größten Wert Lastupdated wäre. Ich schaute bereits auf this solution, aber ich weiß nicht, wie man die Zählung und die Gruppierung nach Wert und Route maximum lastUpdated kombiniert. Hier ist die Beispieldaten von dem, was ich erreichen möchte:
Beispiel:
List<Route> routes = new ArrayList<>();
routes.add(new Route(new Cell(1, 2), new Cell(2, 1), 1200L));
routes.add(new Route(new Cell(3, 2), new Cell(2, 5), 1800L));
routes.add(new Route(new Cell(1, 2), new Cell(2, 1), 1700L));
SOLLTEN zu konvertierenden:
Map<Route, Long> routesCounted = new HashMap<>();
routesCounted.put(new Route(new Cell(1, 2), new Cell(2, 1), 1700L), 2);
routesCounted.put(new Route(new Cell(3, 2), new Cell(2, 5), 1800L), 1);
Beachten Sie, dass der Schlüssel für die Zuordnung, die gezählt 2 Routen ist die mit dem größten Wert für die letzte Aktualisierung.
In Beispiel Sie verwenden 'neu Route 'mit 3 Parametern, während der einzige Konstruktor 4 Parameter hat. Könnten Sie das bitte korrigieren? –
Ups mein schlechtes. Es ist jetzt behoben. Grundsätzlich spielt die DropOffSize-Größe hier keine Rolle, aber ich habe sie im Code belassen, weil ich alle überschriebenen Methoden anzeigen wollte und die compareTo-Methode dropOffSize verwendet. –