如何根据Java中的几个条件从列表中删除重复项

时间:2015-07-24 13:50:50

标签: java algorithm sorting filtering

我有一个飞行物体列表,该物体有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 。其他航班不在列表中。我怎么能这样做?

3 个答案:

答案 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)

我的实施有点长,但很容易。

  • 按目的地列表大小的降序对列表进行排序。
  • 删除包含重复ID的广告投放。

工作代码here

这是代码。

Failed to recognize predicate 'sv'. Failed rule: 'kwInner' in join type specifier