如何";分组方式;Java中按类属性列出的对象列表?

如何";分组方式;Java中按类属性列出的对象列表?,java,data-structures,linked-list,Java,Data Structures,Linked List,我有一个带有节点的链表,每个节点都包含飞行对象 具有多个属性(起点城市、终点城市等) 我想以类似于SQL的GROUPBY的方式构建一个列表;对于每个始发城市,所有航班及其始发地 我曾尝试将城市存储在一个列表中,但我不知道如何初始化它,NetBeans说我不能,也不知道如何初始化 这是我到目前为止得到的,最后一部分是一个评论,因为我不知道如何正确地实现它 public void PrintList() { NodeFlight aux = start; List<String

我有一个带有节点的链表,每个节点都包含飞行对象 具有多个属性(起点城市、终点城市等)

我想以类似于SQL的GROUPBY的方式构建一个列表;对于每个始发城市,所有航班及其始发地

我曾尝试将城市存储在一个列表中,但我不知道如何初始化它,NetBeans说我不能,也不知道如何初始化

这是我到目前为止得到的,最后一部分是一个评论,因为我不知道如何正确地实现它

public void PrintList() {
    NodeFlight aux = start;
    List<String> Ciudades;

    while (aux != null) {
        //add to the list cities if current.getcity isn't in the list already??
        //current=next;
    }

    //loop for each element in the city list
    //current=start;

    //loop if current equals to the first element of the list?
    //print each element which origin city is equals to the city list current index
    //close first loop

    //next city? i++? whatever
    //close bigger loop?
}

等等。

使用Java8 Streams API这是一项非常简单的任务:流式传输您的航班,并使用
收集器收集航班。groupingBy

假设您的航班是这样的:

List<Flight> flights = new LinkedList<>();
flights.add(new Flight("Zurich", "London"));
flights.add(new Flight("Madrid", "London"));
flights.add(new Flight("Madrid", "Rome"));
flights.add(new Flight("Zurich", "New York"));
flights.add(new Flight("New York", "London"));
输出:

传出:
-从纽约到伦敦
-从马德里到伦敦和罗马
-从苏黎世到伦敦和纽约
传入:
-从苏黎世到纽约
-从马德里到罗马
-从苏黎世、马德里、纽约到伦敦


看起来您想要对自定义对象的列表进行排序。我假设我没有创建任何节点。我只是在一个简单的飞行物体上做手术

public class Flight  implements Comparable<Flight>{
    private String sourceCity;
    private String destinationCity;

    public Flight(String sourceCity,String destinationCity)
    {
        this.sourceCity=sourceCity;
        this.destinationCity=destinationCity;
    }

    public String getSourceCity() {
        return sourceCity;
    }

    public String getDestinationCity() {
        return destinationCity;
    }


    @Override
    public int compareTo(Flight o) {
        return (this.sourceCity.compareTo(o.getSourceCity()));
    }


}



public static void main(String[] args) {

    Flight f1=new Flight("A","B");
    Flight f2=new Flight("B","C");
    Flight f3=new Flight("D","F");
    Flight f4=new Flight("AB","BC");
    Flight f5=new Flight("ZA","B");
    Flight f6=new Flight("YB","C");
    Flight f7=new Flight("C","ZA");
    Flight f8=new Flight("B","BC");
    Flight f9=new Flight("A","BB");
    Flight f10=new Flight("B","CE");
    Flight f11=new Flight("D","ZSA");
    Flight f12=new Flight("B","BVC");

    List<Flight> flightList=new ArrayList<Flight>();
    flightList.add(f1);
    flightList.add(f2);
    flightList.add(f3);
    flightList.add(f4);
    flightList.add(f5);
    flightList.add(f6);
    flightList.add(f7);
    flightList.add(f8);
    flightList.add(f9);
    flightList.add(f10);
    flightList.add(f11);
    flightList.add(f12);

    Collections.sort(flightList);

    for(Flight f:flightList)
    {
        System.out.println("Source city= "+f.getSourceCity()+" Destination city= "+f.getDestinationCity());
    }


}

我想它会帮助您..

使用图表而不是列表,那么距离为1的所有节点都是可以到达的目的地,而无需更改平面。这似乎非常方便,但我不完全熟悉它的功能,我编辑了我的问题并添加了我想要的格式,您认为我可以用它实现吗?
Map<String, List<Flight>> flightsFromEachCity = 
    flights.stream().collect(Collectors.groupingBy(Flight::getCityFrom));

Map<String, List<Flight>> flightsToEachCity = 
    flights.stream().collect(Collectors.groupingBy(Flight::getCityTo));
System.out.println("OUTGOING:");
for (String city : flightsFromEachCity.keySet()) {
    String cities = flightsFromEachCity.get(city).stream().map(Flight::getCityTo).collect(Collectors.joining(" and "));
    System.out.println("- from " + city + " to " + cities);
}
System.out.println("INCOMING:");
for (String city : flightsToEachCity.keySet()) {
    String cities = flightsToEachCity.get(city).stream().map(Flight::getCityFrom).collect(Collectors.joining(" and "));
    System.out.println("- from " + cities + " to " + city);
}
public class Flight  implements Comparable<Flight>{
    private String sourceCity;
    private String destinationCity;

    public Flight(String sourceCity,String destinationCity)
    {
        this.sourceCity=sourceCity;
        this.destinationCity=destinationCity;
    }

    public String getSourceCity() {
        return sourceCity;
    }

    public String getDestinationCity() {
        return destinationCity;
    }


    @Override
    public int compareTo(Flight o) {
        return (this.sourceCity.compareTo(o.getSourceCity()));
    }


}



public static void main(String[] args) {

    Flight f1=new Flight("A","B");
    Flight f2=new Flight("B","C");
    Flight f3=new Flight("D","F");
    Flight f4=new Flight("AB","BC");
    Flight f5=new Flight("ZA","B");
    Flight f6=new Flight("YB","C");
    Flight f7=new Flight("C","ZA");
    Flight f8=new Flight("B","BC");
    Flight f9=new Flight("A","BB");
    Flight f10=new Flight("B","CE");
    Flight f11=new Flight("D","ZSA");
    Flight f12=new Flight("B","BVC");

    List<Flight> flightList=new ArrayList<Flight>();
    flightList.add(f1);
    flightList.add(f2);
    flightList.add(f3);
    flightList.add(f4);
    flightList.add(f5);
    flightList.add(f6);
    flightList.add(f7);
    flightList.add(f8);
    flightList.add(f9);
    flightList.add(f10);
    flightList.add(f11);
    flightList.add(f12);

    Collections.sort(flightList);

    for(Flight f:flightList)
    {
        System.out.println("Source city= "+f.getSourceCity()+" Destination city= "+f.getDestinationCity());
    }


}
Source city= A Destination city= B
Source city= A Destination city= BB
Source city= AB Destination city= BC
Source city= B Destination city= C
Source city= B Destination city= BC
Source city= B Destination city= CE
Source city= B Destination city= BVC
Source city= C Destination city= ZA
Source city= D Destination city= F
Source city= D Destination city= ZSA
Source city= YB Destination city= C
Source city= ZA Destination city= B