为了账号安全,请及时绑定邮箱和手机立即绑定

如何在静态递归方法之外声明通用ArrayList?

如何在静态递归方法之外声明通用ArrayList?

繁花不似锦 2023-12-13 14:51:13
我正在尝试创建一个方法来递归地反转ArrayList泛型,并且在声明数组时遇到问题reversedList(请参见下面的代码第 4 行)。按照代码所示,我收到错误:找不到符号类别:E我发现停止错误的唯一方法是reversedList在方法内部声明,但每次递归时它都会重置。import java.util.ArrayList;import java.util.List;public class ListRecursive<E>{   public static List<E> reversedList= new ArrayList<E>();   public static  <E>  void reverse(ArrayList<E> inputList){      E firstitem = null;      if (inputList.size() == 0 ) {         return;      }       else {         firstitem = inputList.get(0);         inputList.remove(0);      }      reverse(inputList);      reversedList.add( firstitem );   } 下面是 main 方法,它创建一个命令行参数的 ArrayList 并尝试使用上面的方法反转它。 public static void main(String args[]){      ArrayList<String> argList = new ArrayList<>();      ArrayList<Double> numericArgs = new ArrayList<>();      for (String s : args) {         argList.add(s);         try {            numericArgs.add(Double.parseDouble(s));         }         catch (NumberFormatException e) {            System.out.println(e.getMessage() + "is not numeric...skipping");         }      }      System.out.print("Command line arguments before reversal: ");      for (int i=0; i<argList.size(); i++)         System.out.print(argList.get(i)+ " ");      System.out.println();      reverse(argList);      System.out.print("Command line arguments afterreversal: ");      for (int i=0; i<argList.size(); i++)         System.out.print(argList.get(i)+ " ");      System.out.println();   }
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

假设是你。

  1. 想要递归地做

  2. 不想破坏原来的列表。

  3. 并且不想在方法外部分配新的列表。

您可以执行以下操作:

   public static <E> List<E> reverse(List<E> inputList) {

      List<E> ret = new ArrayList<>();

      E o = inputList.remove(0);

      if (inputList.size() > 0) {

         ret = reverse(inputList);

      }

      // at this point they will be on the stack in reverse order.


      // so add them to the stack in that order.

      ret.add(o);

      // return the orginal list to its initial state by inserting them at the beginning.

      inputList.add(0, o);

      return ret;

   }


用这个打电话。


      List<Integer> ints = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

      System.out.println(reverse(ints));

      System.out.println(ints);

产生此输出。


[5, 4, 3, 2, 1]

[1, 2, 3, 4, 5]


当然,非递归解决方案是微不足道的。


注意:传递的列表必须支持List.remove()并使其mutable起作用。如果使用List.of()或声明列表,则Arrays.asList()必须将列表作为参数传递给ArrayList<>()构造函数。


查看完整回答
反对 回复 2023-12-13
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

首先,如果它是一个实用方法,为什么要存储参数,如果不是,那么为什么它是静态的。您也不需要多个实例,因为 java 中的方法参数是按引用传递的。更重要的是,递归意味着您的列表将受到调用堆栈限制。


在线尝试

public static <E> void reverse(List<E> list) {

  for (int i=0;i<list.size()/2;i++) {

      E temp = list.get(i);

      list.set(i, list.get(list.size()-i-1));

      list.set(list.size()-i-1, temp);

  }

}


查看完整回答
反对 回复 2023-12-13
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信