List<Type> Konvertieren in List<List<Type>>

PollerJava

Top Contributor
Hallo,

ich habe ein - glaube ich - eher spezielles Problem. Ich habe eine Liste, die so wie unten ausschaut:

Code:
final List<MyType> myList = new ArrayList<>();

Code:
Type: 
public class MyType {
   
   ...
   private DateTime startTime;
   private DateTime endTime;
   private DateTime dateOfContainer; // with @JSONSerializer - deshalb wird unten nur das Datum ausgegeben

}

Meine Frage wär jetzt, wie ich die MyType - Objecte zusammenbring, sodass ich dann:

List<List<MyType>>

habe: Unten würde z.B. die ersten zwei zusammengehören, da beide dateOfContainer mit "27.11.2015" haben.

Wäre Euch dankbar für Hinweise in diese Richtung.
Danke!
Poller

Code:
[
{
...
"endTime": "16:00",
"startTime": "13:00",
"dateOfContainer": "27.11.2015"
},
{
...
"endTime": "12:00",
"startTime": "08:00",
"dateOfContainer": "27.11.2015"
},
{
...
"endTime": "16:00",
"startTime": "13:00",
"dateOfContainer": "25.11.2015"
},
{
...
"endTime": "19:00",
"startTime": "18:00",
"dateOfContainer": "21.11.2015"
},
...
 
Ich verstehe nicht so recht, was du tun willst. Willst du deine MyTypes nach dateOfContainer gruppieren?
Und müssen es Lists sein oder reicht dir Collection auch?
 
Ich würde vermutlich erstmal sortieren, und dann über die sortierte Liste iterieren. Zu beginn zwei leere Listen anlegen (eine, welche MyType aufnimmt, und eine weitere, welche deine Listen aufnimmt) und solange sich das dateOf-Date nicht ändert, alls da rein packen. Ändert sich das dateOf-Date, dann packst du die nun fertige erste Liste in die "Listen-Liste". Anschließend neue "Teil-Liste" anlegen und wieder so lange die gefunden Elemente dort einfügen, bis sich das dateOf-Date wieder ändert.
Solange das Spielchen wiederholen, bis du die gesamte ursprüngliche Liste abgearbeitet hast.
 
Java 8 Streaming API:
Java:
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
   public static void main(String... args) {
     List<MyType> myTypes = Arrays
         .asList(new MyType(LocalTime.of(13, 00), LocalTime.of(16, 00), LocalDate.of(2015, 11, 27)),
             new MyType(LocalTime.of(8, 00), LocalTime.of(12, 00), LocalDate.of(2015, 11, 27)),
             new MyType(LocalTime.of(13, 00), LocalTime.of(16, 00), LocalDate.of(2015, 11, 25)),
             new MyType(LocalTime.of(18, 00), LocalTime.of(19, 00), LocalDate.of(2015, 11, 21)));
     List<List<MyType>> collect = myTypes.stream().collect(Collectors
         .collectingAndThen(Collectors.groupingBy(MyType::getDateOfContainer), m -> new ArrayList<>(m.values())));
     System.out.println(collect);
     
   }
}

class MyType {
   
   private final LocalTime startTime;
   private final LocalTime endTime;
   private final LocalDate dateOfContainer;
   
   public MyType(LocalTime startTime, LocalTime endTime, LocalDate dateOfContainer) {
     this.startTime = startTime;
     this.endTime = endTime;
     this.dateOfContainer = dateOfContainer;
   }
   
   public LocalTime getStartTime() {
     return startTime;
   }
   
   public LocalTime getEndTime() {
     return endTime;
   }
   
   public LocalDate getDateOfContainer() {
     return dateOfContainer;
   }
   
   @Override
   public String toString() {
     return "MyType [startTime=" + startTime + ", endTime=" + endTime + ", dateOfContainer=" + dateOfContainer + "]";
   }
}
 

Zurück
Oben