我有一个飞行物体列表,该物体有id(长)和目的地(String)。我需要做的是删除相同ID的重复条目。但条件是删除那些元素,我只能保留具有最长目的地列表的元素。
Flight{
Long id;
String destination;
}
列出航班< - 这是必须根据条件进行过滤的。
列表示例:
flight1 -> id:456 , destination LON/DXB
flight2 -> id:456 , destination LON/DXB/IND
flight3 -> id:465 , destination LON/DXB/IND/CMB
flight4 -> id:555 , destination LON/DXB
flight5 -> id:666 , destination DXB/SHJ
flight6 -> id:666 , destination DXB/SHJ/BOM
根据给出的条件我只能保留在列表中: flight3,flight4,flight6 。其他航班不在列表中。我怎么能这样做?
答案 0 :(得分:1)
你可以做的是拥有一个地图,使关系在id和实例之间传递。
在迭代列表时,检查地图中是否存在具有相同ID的实例。如果不是这种情况,您只需添加映射,否则您将比较目标的长度(或您想要比较的任何内容),并在必要时更新映射。
Map<Long, Flight> map = new HashMap<>();
for(Flight f : flights) {
if(map.containsKey(f.id)) {
if(map.get(f.id).destination.length() < f.destination.length()) {
map.put(f.id, f);
}
} else {
map.put(f.id, f);
}
}
//you can even store them in a set
List<Flight> longestDestinationFlights = new ArrayList<>(map.values());
答案 1 :(得分:0)
好的,我希望你有一个像List<Flight>
这样的航班列表。
我进一步假设,将会有更多的条目
应该存储重复和“更长”的目的地。
你要做的是使用迭代器进行迭代。 (删除时不能使用for循环)
List<Flight> a = new ArrayList<>();
List<Flight> copy = new ArrayList<>();
Collections.copy(copy, a);
Iterator<Flight> it = a.iterator();
while(it.hasNext()){
Flight f = it.next();
if(shouldGetRemoved(f, copy)){
it.remove();
}
}
shouldGetRemoved
是您比较目的地的逻辑。
将是另一个循环复制。
答案 2 :(得分:0)
我的实施有点长,但很容易。
工作代码here。
这是代码。
Failed to recognize predicate 'sv'. Failed rule: 'kwInner' in join type specifier