【问题标题】:Possible incorrect calling of ArrayList index?可能不正确调用 ArrayList 索引?
【发布时间】:2015-06-27 16:15:47
【问题描述】:

所以我对这个程序的目标是创建一个将字符串和ArrayList 作为参数的方法,它将字符串添加到ArrayList,然后按字母顺序排列整个内容并返回按字母顺序排列的@987654323 @ 包括字符串。

我遇到问题的线路是alphabetized.get(x) = arr.get(x);

程序无法编译,因为它无法识别值 x,但我在 for 循环的前面声明了它,所以我不确定为什么它不会运行......

public class TestArrays {
    static Scanner reader = new Scanner(System.in);

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

        ArrayList<String> names = new ArrayList<String>();
        names.add("anna");
        names.add("bob");
        names.add("matthew");
        names.add("charles");
        names.add("effron");
        System.out.print(newArray(names, pat));
    }

    public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
        List<String> alphabetized = new ArrayList<String>(arr.size());
        arr.add(str);
        java.util.Collections.sort(arr);
        for (int x=0; x<=arr.size();x++){
            alphabetized.get(x) = arr.get(x);
        }
        return alphabetized;
    }
}

谢谢

【问题讨论】:

    标签: java string methods arraylist alphabetized


    【解决方案1】:

    问题是表达式alphabetized.get(x) 是一个值,而不是一个变量,所以你不能给它赋值。这与数组访问表达式相反,它可以充当变量,例如alphabetizedArray[x] = array[x];.

    您需要set method,它接受一个索引和该索引的新值。

    alphabetized.set(x, arr.get(x));
    

    【讨论】:

      【解决方案2】:

      几件事。

      首先,在您的 newArray 方法中,无需创建副本并返回该副本,除非您不想更改原始 ArrayList

      static Scanner reader = new Scanner(System.in);
      
      public static void main(String[] args) {    
          String pat = reader.nextLine();
      
          ArrayList<String> names = new ArrayList<String>();
          names.add("anna");
          names.add("bob");
          names.add("matthew");
          names.add("charles");
          names.add("effron");
          System.out.print(newArray(names, pat));
      }
      
      public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
          ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
          arr.add(str);
          java.util.Collections.sort(arr);
      
          return arr;
          //for (int x=0; x<arr.size();x++){
          //    alphabetized.add(arr.get(x));
          //}
          //return alphabetized;
      }
      

      结果:

      第二,如果你要复制到另一个数组,理解这行代码。

          ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
      

      您刚刚创建了一个列表,其容量与您传入的数组大小相同,其中没有实际元素。您仍然必须像任何其他列表一样添加到列表中。一旦你添加了一个尺寸大于容量的元素,就会自动分配新的内存来保存新的项目。

      编辑

      我忘了提到你的 for 复制循环应该是

      for (int x = 0; x < arr.size(); x++)
      

      代替

      for (int x = 0; x <= arr.size(); i++)
      

      您的原始 for 循环将导致 IndexOutOfBounds 异常,因为您将尝试从原始数组中获取超过其最大索引值的项目。一个 10 项列表的大小为 10,但索引从 0 到 9。您原来的 for 循环将尝试获取不存在的索引 10。

      static Scanner reader = new Scanner(System.in);
      
      public static void main(String[] args) {    
          String pat = reader.nextLine();
      
          ArrayList<String> names = new ArrayList<String>();
          names.add("anna");
          names.add("bob");
          names.add("matthew");
          names.add("charles");
          names.add("effron");
          System.out.print(newArray(names, pat));
      }
      
      public static ArrayList<String> newArray(ArrayList<String> arr, String str) {
          ArrayList<String> alphabetized = new ArrayList<String>(arr.size());
          arr.add(str);
          java.util.Collections.sort(arr);
          for (int x=0; x<arr.size();x++){
              alphabetized.add(arr.get(x));
          }
          return alphabetized;
      }
      

      结果:

      【讨论】:

        【解决方案3】:

        要更改 ArrayList 中的值,您必须使用 set 方法。在您的情况下,替换 alphabetized.get(x) = arr.get(x); 的正确代码是alphabetized.set(x, arr.get(x)); 但是我不明白为什么您不能只返回 arr 而不是按字母顺序排列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-23
          • 2016-11-05
          • 2023-03-03
          • 2020-01-27
          • 2012-03-30
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多