繁体   English   中英

反转Java中的通用集合

[英]Reverse a generic collection in Java

我有以下任务:

“声明一个方法,需要一个Collection并在您的方法中将其反转。返回给定的相同collection,不要返回新的collection!

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

不要尝试使用Collections.reverse。 它仅适用于列表,不适用于集合”

我最初的想法是以下事情:

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)

任何想法应该怎么做?

由于许多Collection类(例如HashSet )都不允许您控制顺序,因此您无法做想做的事情。

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

尽管通常不可能完成此任务(例如,对于不可变的集合以及不按插入顺序进行迭代的集合),但是您可以撤消保留插入顺序并按如下方式实现可选的clearaddAll任何集合:

<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可能会有所不同;对于TreeSet不会有所不同)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM