在Java中反转泛型集合

在Java中反转泛型集合,java,generics,collections,reverse,Java,Generics,Collections,Reverse,我有以下任务: 声明一个方法,需要一个集合,并在方法中反转它。返回给定的相同集合,不要返回新集合 static <T> void reverse (Collection<T> collection) 你知道该怎么做吗?你想做的事情是做不到的,因为许多Collection类(例如HashSet)不允许你控制顺序 问题是没有定义常规集合中元素的顺序。例如,设想一个集合,它不能保证元素的顺序。 由于没有顺序,很难定义什么是逆序。而任务通常是不可能的(例如,对于不可变的集合,

我有以下任务:

声明一个方法,需要一个集合,并在方法中反转它。返回给定的相同集合,不要返回新集合

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

你知道该怎么做吗?

你想做的事情是做不到的,因为许多
Collection
类(例如
HashSet
)不允许你控制顺序

问题是没有定义常规
集合中元素的顺序。例如,设想一个
集合,它不能保证元素的顺序。

由于没有顺序,很难定义什么是逆序。

而任务通常是不可能的(例如,对于不可变的集合,以及不按插入顺序迭代的集合),您可以反转保留插入顺序的任何集合,可选的
清除
添加所有
实现如下:

<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;
}
C反转(C英寸){
//将集合的内容复制到新列表中。
列表列表=新的ArrayList(in);
//从原始容器中取出所有物品。
in.clear();
//把清单倒过来。
收款。反向(列表);
//把所有东西都放回原来的容器里。
in.addAll(列表);
//如果不支持addAll,但支持add,则可以执行以下操作
//对于(T:list){in.add(T);}
返回;
}

对于未保留插入顺序的集合,这可能会也可能不会导致不同的顺序(例如,对于
哈希集
,它可能会不同;对于
树集
,它不会不同).

似乎实现集合的实际类(其实例已传递给方法)不支持
add
操作。例如,
数组返回的
List
。asList
是一个不支持
add
的列表。听起来他们希望您使用命令
Collections.swap()
-然而,这只适用于列表。谁给你安排了这项任务?这是毫无意义和不可能的。集合通常是不有序的,这正是现有的
反向
交换
方法只接受列表的原因。是的,你说得对!这项任务不是由任何人指定给我的。我只是在解决一些Java问题问题,所以我可以做得更好。感谢您的快速响应!是的,我想任务的要求是一团糟。可能他们指的是支持订单的集合,例如ArrayList。非常感谢!
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)
<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;
}