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

我正在尝试创建一个方法来递归地反转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();

   }


繁花不似锦
浏览 114回答 2
2回答

哈士奇WWW

假设是你。想要递归地做不想破坏原来的列表。并且不想在方法外部分配新的列表。您可以执行以下操作:&nbsp; &nbsp;public static <E> List<E> reverse(List<E> inputList) {&nbsp; &nbsp; &nbsp; List<E> ret = new ArrayList<>();&nbsp; &nbsp; &nbsp; E o = inputList.remove(0);&nbsp; &nbsp; &nbsp; if (inputList.size() > 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret = reverse(inputList);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; // at this point they will be on the stack in reverse order.&nbsp; &nbsp; &nbsp; // so add them to the stack in that order.&nbsp; &nbsp; &nbsp; ret.add(o);&nbsp; &nbsp; &nbsp; // return the orginal list to its initial state by inserting them at the beginning.&nbsp; &nbsp; &nbsp; inputList.add(0, o);&nbsp; &nbsp; &nbsp; return ret;&nbsp; &nbsp;}用这个打电话。&nbsp; &nbsp; &nbsp; List<Integer> ints = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));&nbsp; &nbsp; &nbsp; System.out.println(reverse(ints));&nbsp; &nbsp; &nbsp; System.out.println(ints);产生此输出。[5, 4, 3, 2, 1][1, 2, 3, 4, 5]当然,非递归解决方案是微不足道的。注意:传递的列表必须支持List.remove()并使其mutable起作用。如果使用List.of()或声明列表,则Arrays.asList()必须将列表作为参数传递给ArrayList<>()构造函数。

侃侃尔雅

首先,如果它是一个实用方法,为什么要存储参数,如果不是,那么为什么它是静态的。您也不需要多个实例,因为 java 中的方法参数是按引用传递的。更重要的是,递归意味着您的列表将受到调用堆栈限制。在线尝试public static <E> void reverse(List<E> list) {&nbsp; for (int i=0;i<list.size()/2;i++) {&nbsp; &nbsp; &nbsp; E temp = list.get(i);&nbsp; &nbsp; &nbsp; list.set(i, list.get(list.size()-i-1));&nbsp; &nbsp; &nbsp; list.set(list.size()-i-1, temp);&nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java