【问题标题】:Reverse a generic list?反转通用列表?
【发布时间】:2016-02-15 10:37:18
【问题描述】:
public static <T> List<T> arrayListReverse(List<T> lst) {
  ArrayList reversed= new ArrayList();
  for (int i=lst.size()-1;i>=0;i--){
  <T> t= lst.get(i);
  reversed.add(t);
  }
 return reversed;
 }

我希望能够返回一个与原始列表相反的列表。它应该能够适用于任何类型。当涉及到 t=input.get(i); 时,我不断收到错误。 编辑:我只想使用 List 界面

【问题讨论】:

  • &lt;T&gt; t= lst.get(i); 中只写T 而不是&lt;T&gt;。这是因为变量的类型是T
  • 除非用于练习,否则请使用Collections.reverse
  • 谢谢。但是,我得到这个:发现2个警告:警告:未检查调用 add(E) 作为原始类型 java.util.ArrayList 的成员警告:需要未经检查的转换:发现 java.util.List:java。 util.ArrayList –

标签: java generics arraylist


【解决方案1】:

&lt;T&gt; 应该是T

public static <T> List<T> arrayListReverse(List<T> lst) {
    ArrayList reversed= new ArrayList();
    for (int i=lst.size()-1;i>=0;i--){
      T t = lst.get(i);
      reversed.add(t);
    }
   return reversed;
}

【讨论】:

  • 谢谢。但是,我得到了这个:发现2个警告:警告:未经检查地调用add(E)作为原始类型java.util.ArrayList的成员警告:需要未经检查的转换:发现java.util.List:java。 util.ArrayList
  • 你只需要反向列表或反向列表中的字符串反向?
【解决方案2】:

你也可以这样用:

ArrayList reversed = new ArrayList();
reversed=Collections.reverse(startArray);

Documentation:

public static void reverse(列表列表)

反转指定列表中元素的顺序。

此方法以线性时间运行。

参数:

list - 要反转其元素的列表。

投掷:

UnsupportedOperationException - 如果指定的列表或其列表迭代器不支持设置操作。

【讨论】:

  • 这不保留泛型,Collections.reverse(new ArrayList()) 的响应将只是 ArrayList(),泛型类型将丢失
【解决方案3】:
public static <T> List<T> arrayListReverse(List<T> lst) {
    Collections.reverse(lst);
    return lst;
}

【讨论】:

    【解决方案4】:

    在您的代码中&lt;T&gt; t = 应该只是T t =,但您也可以使用for-each loop 并在向前迭代时添加到reversed 的前面。而且,您不应该使用raw types(您没有为reversed 指定泛型),您可以使用菱形运算符&lt;&gt;。您可以使用与输入相同的初始大小来初始化输出列表。类似的东西

    public static <T> List<T> arrayListReverse(final List<T> lst) {
        List<T> reversed = new ArrayList<>(lst.size());
        for (T t : lst) {
            reversed.add(0, t);
        }
        return reversed;
    }
    

    【讨论】:

      【解决方案5】:

      如果您确实希望该方法返回与作为参数给出的相同类型的列表,请使用以下内容:

          public static <T,L extends List<T>> L reverse(L list){
              Collections.reverse(list);
              return list;
          }
      

      如果你传递一个字符串向量,这将返回一个Vector&lt;String&gt;
      如果您传递Somethings的ArrayList,它将返回ArrayList&lt;Something&gt;
      当您传递 Doom 的 LinkedList 时,它将返回 LinkedList&lt;Doom&gt;

      我想,你明白了。

      顺便说一句,Madushan Perera`s 答案也将返回与传递相同的类型,但在这种情况下,如果分配给原始变量,则必须进行强制转换。

      【讨论】:

        猜你喜欢
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 2015-09-30
        • 2014-04-13
        相关资源
        最近更新 更多