【问题标题】:Add multiple numbered objects to ArrayList将多个编号的对象添加到 ArrayList
【发布时间】:2014-09-15 07:37:44
【问题描述】:

假设我有很多字符串变量(例如 100 个):

   String str1 = "abc";
    String str2 = "123";
    String str3 = "aaa";
....
    String str100 = "zzz";

我想把这些String变量加到ArrayList中,我现在做的是

    ArrayList<String> list = new ArrayList<String>();
    list.add(str1);
    list.add(str2);
    list.add(str3);
...
    list.add(str100);

我很好奇,有没有办法使用循环?例如。

for(int i =  1; i <= 100; i++){
     list.add(str+i)//something like this?
}

【问题讨论】:

  • 在 VBScript 和其他语言中可以使用“Execute (sString)”命令。但我不认为Java有这样的命令。
  • 一般来说,如果你有那么多String 变量,你就做错了。始终考虑将它们存储在某种数组或列表结构或Map
  • 这些String变量从何而来?为什么你有 100 个不同的变量,它们的名称仅相差一个数字?这需要一个数组!

标签: java string arraylist


【解决方案1】:

使用数组:

String[] strs = { "abc","123","zzz" };

for(int i =  0; i < strs.length; i++){
     list.add(strs[i]);  //something like this?
}

这个想法非常流行,以至于有内置的方法可以做到这一点。例如:

  list.addAll( Arrays.asList(strs) );

会将您的数组元素添加到现有列表中。如果您只想要一个仅包含数组元素的列表,则可以在一行中完成:

  List<String> list = Arrays.asList( strs );

【讨论】:

    【解决方案2】:

    如果 strX 是类字段,那么您可以尝试使用反射 - link 访问字段和方法的示例。

    如果它是局部变量,那么您将无法访问其名称,因此您将无法执行此操作(除非 str 是数组,因此您可以通过 str[i] 访问其值,但您可能不需要ArrayList)。

    更新:

    在您更新问题并显示您有 100 个变量之后

    String str1 = "abc";
    String str2 = "123";
    String str3 = "aaa";
    //...
    String str100 = "zzz";
    

    我必须说你需要数组。将数组产品引入编程语言正是为了避免您现在遇到的情况。因此,您应该使用而不是声明 100 个单独的变量

    String[] str = {"abc", "123", "aaa", ... , "zzz"};
    

    然后通过str[index] 访问值,其中索引是0 和数组大小-1 之间的值,在您的情况下,范围为0 - 99


    如果您仍然需要将所有数组元素放入列表中,您可以使用

    List<String> elements = new ArrayList<>(Arrays.asList(str));
    

    哪个会先

    Arrays.asList(str)
    

    创建由str 数组备份的列表(这意味着如果您对数组进行任何更改,它将反映在列表中,反之亦然,从此方法对列表所做的更改将影响str 数组)。

    为了避免列表依赖于数组的状态,我们可以创建单独的列表,它将元素从早期列表复制到它自己的数组中。我们可以简单地使用构造函数来做到这一点

    new ArrayList<>(Arrays.asList(str));
    

    或者我们可以将这些步骤更多地分开

    List<String> elements = new ArrayList<>();//empty list
    elements.addAll(Arrays.asList(str));//copy all elements from one list to another
    

    【讨论】:

    • @Pshemo 能否提供使用反射的代码?
    • 对于这样一个微不足道的问题,反思是大材小用
    • @CSnerd 我在 SO 上添加了指向示例的链接,但如果 str 变量是方法的局部变量,这将无济于事。
    • @redFIVE 我知道需要考虑性能。只是出于好奇,我想知道如何使用反射来解决这个问题
    • @CSnerd,反射是一个高级概念。您可能应该首先掌握基础知识。
    【解决方案3】:

    是的。使用循环的方法不是声明 100 个字符串变量。请改用一个数组。

    String[] str = new String[101];
    str[1] = "abc";
    str[2] = "123";
    str[3] = "aaa";
    ....
    str[100] = "zzz";
    

    (我使索引从 1 变为 100 以显示它与原始代码的对应关系,但从 0 变为 99 更正常,并使用数组初始化器对其进行初始化,如@markspace 的答案。)

    【讨论】:

      【解决方案4】:

      如果您想坚持良好的做法,请在数组中声明您的 Strings:

      String[] strs = new String[]{ "abc", "123", "aaa", ... };
      for (String s : strs) // Goes through all entries of strs in ascending index order (foreach over array)
          list.add(s);
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 Java 9,那么您可以轻松地将多个字符串对象添加到数组列表中

        List<String> strings = List.of("abc","123","zzz");
        

        【讨论】:

          【解决方案6】:

          以下内容在您拥有的特定 String 值上创建 ArrayList

          ArrayList<String> list1 = new ArrayList<String>() {{addAll(Arrays.asList(new String[]{"99", "bb", "zz"}));}};
          

          或者,如果它只是你想要的一些不同的值,就用它来表示 - 其中 10 个:

          ArrayList<String> list2 = new ArrayList<String>() {{for (int i=0; i<10; i++) add(""+System.currentTimeMillis());}};
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-12
            • 1970-01-01
            • 2023-03-22
            • 2011-12-24
            • 2016-09-26
            • 1970-01-01
            相关资源
            最近更新 更多