【问题标题】:How can I change an ArrayList that is returned to a method? - Java如何更改返回给方法的 ArrayList? - 爪哇
【发布时间】:2017-11-20 19:10:22
【问题描述】:

那是代码:

import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[]args) {
        changeList();

        System.out.println(Arrays.toString(example().toArray()));
    }

    public static void changeList() {
        example().set(2, "Hi!");
    }

    public static List<String> example () {

        String str = new String("word1|word2|word3|word4|word5");

        return Arrays.asList(str.split("\\|"));
    }
}

我希望 ArrayList 是这样的:[word1, word2, Hi!, word4, word5]
但它并没有改变......它打印[word1, word2, word3, word4, word5]

甚至有可能以这种方式改变它吗? 提前致谢!

【问题讨论】:

  • 将 example() 的返回值移动到一个变量中......
  • 它对我有用。 “它不会改变”是什么意思?你能提供一个完整的运行示例来说明问题吗?
  • 请举一个完整的例子。您应该包含一个 main() 方法,该方法调用此 example() 方法,然后执行您想要的任何其他操作。还添加System.out.println() 调用并显示结果。然后解释你希望你的程序做些什么不同的事情。
  • 发布完整代码。通常设置这样的项目会起作用。很明显,您错过了引入错误的代码的关键部分。
  • 您正在创建 2 个列表。首先修改,但打印一个完全不同的。

标签: java arraylist methods


【解决方案1】:

问题是example 每次调用时都会给出一个全新的List。当您在 changeList 中创建列表时,它与您在 main 中创建的 List 不同,对一个 List 所做的更改不会影响另一个。

解决此问题的一种方法是:

  1. changeList 方法按照它所说的去做:接受List(而不是从头开始生成一个)并更改List
  2. main 方法传入ListchangeList
public static void main(String[]args) {
    List<String> list = example();
    changeList(list);

    System.out.println(Arrays.toString(list.toArray()));
}

public static void changeList(List<String> list) {
    list.set(2, "Hi!");
}

【讨论】:

    【解决方案2】:

    但它并没有改变......甚至可以这样改变它吗?

    是的,您更改了列表,但您丢失了返回集合的引用,因为方法 public E set(int index, E element) 返回 E 而不是列表本身。请参阅 doc

    正如我所说,将 example() 的返回值移动到您可以操作的变量中...

    public static void main (String[] args) {
        List<String> retVal = example();
        System.out.println(retVal);
        retVal.set(2, "Hi!");
        System.out.println(retVal);
    }
    
    public static List<String> example () {
        String str = new String("word1|word2|word3|word4|word5");
        return Arrays.asList(str.split("\\|"));
    }
    

    【讨论】:

    • 你说得对!但是我想更改方法中的值,因为我多次使用方法...
    • @Andy 你这是什么意思?你能用语言解释你试图解决的整个问题吗?
    【解决方案3】:
        public static void main(String[]args) {
            System.out.println(Arrays.toString(changeList().toArray()));
        }
    
        public static List<String>  changeList() {
            List<String> list = example();
            list.set(2, "Hi!");
            return list;
        }
    
        public static List<String> example () {
    
            String str = new String("word1|word2|word3|word4|word5");
    
            return Arrays.asList(str.split("\\|"));
        }
    

    【讨论】:

      【解决方案4】:

      让我们一次一行地浏览您的代码,以了解它在做什么:

       public static void main(String[]args) {
          changeList();
      

      这会调用changeList() 方法:

      public static void changeList() {
          example().set(2, "Hi!");
      

      第一次致电example()

      public static List<String> example () {
          String str = new String("word1|word2|word3|word4|word5");
          return Arrays.asList(str.split("\\|"));
      }
      

      这会创建一个新的List 并将其返回给changeList()

      example().set(2, "Hi!");
      

      现在我们通过将索引 2 处的元素设置为 "Hi!" 来修改返回的 List。但是,修改后的列表会立即被丢弃,因为您不再引用它。

      然后我们回到main:

          System.out.println(Arrays.toString(example().toArray()));
      

      现在我们再次调用示例:

      public static List<String> example () {
          String str = new String("word1|word2|word3|word4|word5");
          return Arrays.asList(str.split("\\|"));
      }
      

      这会创建一个新的List。这个新列表与我们上次调用example() 时创建的列表没有任何关系。

      如果要保持相同的列表,则需要将其分配给changeList() 中的引用,然后返回:

      public static void changeList() {
          List<String> theList = example();
          theList.set(2, "Hi!");
          return theList;
      }
      

      现在main()需要保存对changeList()返回的列表的引用:

      public static void main(String[]args) {
          List<String> mainList = changeList();
      
          System.out.println(mainList);
      }
      

      (注意:您可以直接打印List。您的原始版本比需要的要复杂得多。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 2015-06-07
        • 1970-01-01
        • 2018-06-12
        • 2021-07-15
        相关资源
        最近更新 更多