在java中,我们可以按不同的字段对相同的对象进行分组吗?
我想使用同一对象的不同字段之间的条件比较将单个列表分组到列表列表中 例如:假设我们在java中有下面的类在java中,我们可以按不同的字段对相同的对象进行分组吗?,java,Java,我想使用同一对象的不同字段之间的条件比较将单个列表分组到列表列表中 例如:假设我们在java中有下面的类 class Flight { String departureStation; String arrivalStation; } 现在我有了列表,我想让他们在列表中分组,如果航班是说,f1.arrivalStation==f2.出发站,则将他们分组到一个列表中 例如,假设我们有航班f1={departureStation=“海德拉巴”,arrivalStation=“孟买”},
class Flight {
String departureStation;
String arrivalStation;
}
现在我有了列表
,我想让他们在列表
中分组,如果航班是说,f1.arrivalStation==f2.出发站
,则将他们分组到一个列表中
例如,假设我们有航班f1={departureStation=“海德拉巴”,arrivalStation=“孟买”}
,航班f2={departureStation=“孟买”,arrivalStation=“德里”}
和航班f3={departureStation=“迪拜”,arrivalStation=“纽约”}
,那么最后的列表应该是这样的,
由于
(f1.arrivalStation==f2.departureStation)
这两个应归入一个列表
,而对于f3
,由于与给定条件不匹配,它将单独位于列表
中。在分组时,我们应该得到长度为2
的List
,其中第一个List
应该包含f1和f2
,而其他列表应该只包含f3
,我将从List
创建一个流,并使用.filter()
最终将其收集为一个列表。然后,你可以用这个列表做任何你想做的事情
对于例子,我们认为
(我忽略了缺少的getter和setter。为了正确封装,您可能需要添加它们。)示例实现可以如下所示:
- 将列表元素收集到地图:键-列表元素,值-符合条件的航班列表(自身元素或出发等于到达的元素)
- 检索值集合并对其进行筛选
- 打印结果
List data=Arrays.asList(
新航班(“MOS”、“MAD”),
新航班(“MAD”、“BOS”),
新航班(“MAD”、“JFK”),
新航班(“JFK”、“MOS”)
);
data.stream()
.collect(收集器).toMap(x->x,
x->data.stream()
.filter(y->x.equals(y)| | y.dep().equals(x.arr())
.collect(收集器.toList()))
.values()
.stream()
.filter(e->e.size()>1)
.forEach(System.out::println);
输出:
[MAD -> JFK, JFK -> MOS]
[MOS -> MAD, JFK -> MOS]
[MOS -> MAD, MAD -> BOS, MAD -> JFK]
或者可以检索一组所有机场,然后机场可以选择航班数据-如果提到起飞或抵达:
data.stream()
.flatMap(x->Stream.of(x.dep(),x.arr())
.distinct()
.collect(收集器).toMap(x->x,
x->data.stream()
.filter(y->y.dep().equals(x)
||y.arr()等于(x))
.collect(收集器.toList())
)
.values()
.stream()
.filter(e->e.size()>1)
.forEach(System.out::println);
输出
[MOS -> MAD, JFK -> MOS]
[MOS -> MAD, MAD -> BOS, MAD -> JFK]
[MAD -> JFK, JFK -> MOS]
您需要更好地定义,这是什么类型的分组?有一些样本数据要解释吗?
for(Flight f1 : flights) {
List<Flight> temporaryList = flights.stream()
.filter(f2 -> f1.arrivalStation.equals(f2.departureStation))
.collect(Collectors.toList());
listOfLists.add(temporaryList);
}
[MAD -> JFK, JFK -> MOS]
[MOS -> MAD, JFK -> MOS]
[MOS -> MAD, MAD -> BOS, MAD -> JFK]
[MOS -> MAD, JFK -> MOS]
[MOS -> MAD, MAD -> BOS, MAD -> JFK]
[MAD -> JFK, JFK -> MOS]