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