如何删除java.util.Set中的最后一个元素?

时间:2012-01-07 19:06:12

标签: java collections

我想删除这个集合的每个最后一个元素。

        Set<String> listOfSources = new TreeSet<String>();
        for(Route route:listOfRoutes){
            Set<Stop> stops = routeStopsService.getStops(route);
            for(Stop stop:stops)
               listOfSources.add(stop.getStopName());
         }

这里我想从listOfSources中删除最后一个元素。

5 个答案:

答案 0 :(得分:13)

你需要回到TreeSet,因为Set没有任何订单。

listOfSources.remove( ((TreeSet) listOfSources).last() );

答案 1 :(得分:5)

作为替代方案,您可以将listOfSources设置为SortedSet

SortedSet<String> listOfSources = new TreeSet<String>();

然后您可以使用last()方法而无需转换为TreeSet

listOfSources.remove(listOfSources.last());

我认为这是一种首选方法,因为您认为您的Set有订单。

答案 2 :(得分:3)

对于TreeSet,您可以使用pollLast函数。

listOfSources.pollLast();

请参阅:http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html#pollLast()

答案 3 :(得分:1)

另一种可能性是使用Stack类。 (虽然对问题的效率较低)

     Set<String> listOfSources = new TreeSet<String>();

     Stack<String> stack = new Stack<String>();
     stack.addAll(listOfSources);
     ...
     String lastElement = stack.pop();

pop()方法将获取最后一个元素并将其从堆栈中删除。

答案 4 :(得分:1)

最有效的方法是使用NavigableSet的{​​{1}}方法。

为获得最佳实践,您应将变量声明为pollLast而不是NavigableSet

出于以下几个原因,这比将变量强制转换为Set更好:

  • 您应仅将实现的选择保留在一个地方。如果您按照其他答案中的建议强制转换为TreeSet,然后又在定义变量的位置更改了所选的实现,但是忘记在下面进行更改,则会引发异常
  • 从本质上说,您的逻辑要求您删除最后一个元素,这意味着您期望变量产生的行为是TreeSet的行为,而不仅仅是NavigableSet的行为。因此,选择该变量的类型应使之明确。