Java 使用.add()和for循环将多个字符串对象从arraylist添加到数组

Java 使用.add()和for循环将多个字符串对象从arraylist添加到数组,java,arrays,arraylist,Java,Arrays,Arraylist,在这个方法中,我试图返回当前存储在MediaItem类型的arraylist(称为itemList)中的所有对象的字符串表示形式的常规数组。(我的代码之前的注释中也描述了这一点。)此方法是一个更大的MediaList项目的一部分,该项目包含几个子类,每个子类都是不同类型的媒体(歌曲、书籍、视频游戏等) 我的问题是,当我运行代码并试图打印字符串数组时,它只打印第一个字符串对象,即arraylist。我的循环只是将第一个MediaItem对象添加到字符串数组中,而不是循环并添加每个连续对象。为什么会

在这个方法中,我试图返回当前存储在MediaItem类型的arraylist(称为itemList)中的所有对象的字符串表示形式的常规数组。(我的代码之前的注释中也描述了这一点。)此方法是一个更大的MediaList项目的一部分,该项目包含几个子类,每个子类都是不同类型的媒体(歌曲、书籍、视频游戏等)

我的问题是,当我运行代码并试图打印字符串数组时,它只打印第一个字符串对象,即arraylist。我的循环只是将第一个MediaItem对象添加到字符串数组中,而不是循环并添加每个连续对象。为什么会这样

这是我的代码,以及教授给我们的说明:

 /** TODO 11: implement this method.
   *  This method returns an array of the String representation of all of 
   *  the MediaItem objects that are currently stored in the itemList.
   *  A String representation of a MediaItem is returned by calling its 
    toString() method. 
   *  The array returned may not contain any NULL values. This method returns 
    an array of 
   *  length 0 if the itemList is empty.
   **/
   public String[] getItemListAsStringArray(){
      ArrayList<String> itemListAsString = new ArrayList<String>();
      for (int i = 0; i < itemList.size(); i++) {
         itemListAsString.add(itemList.get(i).toString());
         String[] stringArray = itemListAsString.toArray(new String[0]);
         if (stringArray.length == 0) {
            return stringArray;
         }
         else {
            itemListAsString.add(itemList.get(i).toString()); 
            return stringArray;
         }
      }
      String[] stringArray = itemListAsString.toArray(new String[0]);
      return stringArray;
   }
/**TODO 11:实现此方法。
*此方法返回所有属性的字符串表示形式的数组
*当前存储在itemList中的MediaItem对象。
*MediaItem的字符串表示形式通过调用其
toString()方法。
*返回的数组不能包含任何空值。此方法返回
一系列
*如果itemList为空,则长度为0。
**/
公共字符串[]getItemListAsStringArray(){
ArrayList itemListAsString=新建ArrayList();
对于(int i=0;i
我必须创建一个新的arraylist来添加对象,因为原始arraylist的类型为。然后,我必须将arraylist(我将其命名为“itemListAsString”)转换为一个正则数组,以便能够在方法末尾返回它(我与我的教授进行了检查,我们应该转换为正则数组)


我尝试使用调试器,看起来代码添加了第一个对象,然后循环尝试再次添加完全相同的对象。然后它将退出循环。既然我使用的是for循环,那么代码是否应该转移到arraylist中的下一个对象,而不是尝试添加相同的对象

我更正了我的代码谢谢你的帮助,这是更正后的代码:

public String[] getItemListAsStringArray(){
  ArrayList<String> itemListAsString = new ArrayList<String>();

  for (int i = 0; i < itemList.size(); i++) {
     itemListAsString.add(itemList.get(i).toString());
  }

  String[] stringArray = itemListAsString.toArray(new String[0]);
  return stringArray;
  }
public字符串[]getItemListAsStringArray(){
ArrayList itemListAsString=新建ArrayList();
对于(int i=0;i
我更正了我的代码谢谢你的帮助,这是更正后的代码:

public String[] getItemListAsStringArray(){
  ArrayList<String> itemListAsString = new ArrayList<String>();

  for (int i = 0; i < itemList.size(); i++) {
     itemListAsString.add(itemList.get(i).toString());
  }

  String[] stringArray = itemListAsString.toArray(new String[0]);
  return stringArray;
  }
public字符串[]getItemListAsStringArray(){
ArrayList itemListAsString=新建ArrayList();
对于(int i=0;i
这里有一种更现代的方法来做同样的事情:

public String[] getItemListAsStringArray() {
    return itemList.stream()
                   .filter(Objects::nonNull)
                   .map(Object::toString)
                   .toArray(String[]::new);
}

它们在功能上是等价的,但这种方式有函数式编程的一些优点和缺点。基本上:以这种方式编写的代码通常不太容易出错,但这是有代价的。

这里有一种更现代的方法来做同样的事情:

public String[] getItemListAsStringArray() {
    return itemList.stream()
                   .filter(Objects::nonNull)
                   .map(Object::toString)
                   .toArray(String[]::new);
}

它们在功能上是等价的,但这种方式有函数式编程的一些优点和缺点。基本上:以这种方式编写的代码通常不太容易出错,但这是有代价的。

什么是
itemList
?它的长度是0吗?@jiveturkey正如我提到的,itemList是MediaItem类型的arraylist。它没有指定的长度。您将在循环内而不是在循环后返回,因此在将第一项添加到列表后立即返回数组。@DavidConrad oh jeez,好的,谢谢。所以我应该去掉循环中的return语句,并在最后保留它之外的语句?编辑:所以我想我根本不需要if/else语句?代码似乎在没有它们的情况下正常工作。是的,您现在已经找到了。什么是
itemList
?它的长度是0吗?@jiveturkey正如我提到的,itemList是MediaItem类型的arraylist。它没有指定的长度。您将在循环内而不是在循环后返回,因此在将第一项添加到列表后立即返回数组。@DavidConrad oh jeez,好的,谢谢。所以我应该去掉循环中的return语句,并在最后保留它之外的语句?编辑:所以我想我根本不需要if/else语句?代码在没有它们的情况下似乎可以正常工作。是的,您现在已经知道了。谢谢。我希望我的教授也教过我们,它看起来比我写的要干净得多。不,你很好。你的方法肯定仍然有效,而且可能更有效(尽管我会从基于索引的循环切换到)是的,我使用常规for循环,因为我对它们比for/each更熟悉,但它们看起来不那么杂乱,仍然有效。谢谢。我希望我的教授也教过我们,它看起来比我写的要干净得多。不,你很好。你这样做的方式肯定仍然有效,而且可能更有效(尽管我会从基于索引的循环切换到)是的,我使用常规for循环,因为我对它们比for/each循环更熟悉,但这些循环看起来不那么杂乱,仍然有效。