用Java反转泛型集合

时间:2016-07-17 12:01:40

标签: java generics collections reverse

我有以下任务:

“声明一个方法,期待一个Collection并在你的方法中反转它。返回给定的相同集合,不要返回一个新的集合!。

static <T> void  reverse (Collection<T> collection)

不要尝试使用Collections.reverse。它仅适用于List,而不适用于集合“

我最初的想法是以下内容:

public static <T> void reverse(Collection<T> collection){

    int size = collection.size();
    Iterator<T> iter = collection.iterator();
    Iterator<T> iter2 = collection.iterator();

    for (int i = 0; i < size / 2; i++) {
        collection.add(iter.next());
        iter2.remove();
    }
}

但我不断得到奇怪的例外:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at ReverseCollection.reverse(ReverseCollection.java:16)
at ReverseCollection.main(ReverseCollection.java:25)

知道应该怎么做吗?

2 个答案:

答案 0 :(得分:6)

您想要做的事情无法完成,因为许多Collection类(例如HashSet)不允许您控制订单。

问题是未定义一般Collection中元素的顺序。例如,考虑Set,它不保证元素的顺序。 由于没有排序,很难定义相反的顺序。

答案 1 :(得分:0)

虽然任务通常是不可能的(例如,对于不可变集合,以及不按插入顺序迭代的集合),您可以撤消保留插入顺序的任何集合以及可选clear和{{1}实现如下:

addAll

对于未保留插入顺序的集合,这可能会或可能不会导致不同的排序(例如,对于<T, C extends Collection<T>> C reverse(C in) { // Copy the contents of the collection into a new list. List<T> list = new ArrayList<>(in); // Remove everything from the original container. in.clear(); // Reverse the list. Collections.reverse(list); // Put everything back into the original container. in.addAll(list); // If addAll is not supported, but add is, you can do // for (T t : list) { in.add(t); } return in; } ,它可能会有所不同;对于HashSet,它不会有所不同。