ArrayLists和Arrays如何在Java中相互交互?

时间:2014-10-29 15:55:27

标签: java arrays arraylist

我们如何将Arrays和ArrayLists一起使用(如果可能的话)?

我想将一些字符串存储到ArrayList中,稍后将它们解析出来,将它们解析为String数组,将这些数组存储在ArrayList中,以后能够从ArrayLists中检索数据......

查看此代码,并随意将我分开进行糟糕的编码;自从我使用Java以来​​已经有一段时间了。

public static void parseData() throws IOException
{
    //for reference, nonParsedData is ArrayList<String>
    // while parsedData is ArrayList<String[]>
    String line = new String();
    String[] tempContainer = new String[7];
    Scanner keyboard = new Scanner(System.in);

    for (int x = 0; x < nonParsedData.size(); x++)
    {
        line = nonParsedData.get(x);

        //filling the temporary container to place into the ArrayList of arrays
        tempContainer[0] = line.substring(0,1); //Data piece 1
        tempContainer[1] = line.substring(1,3); //Data piece 2
        tempContainer[2] = line.substring(3,7); //Data piece 3
        tempContainer[3] = line.substring(7,8); //Data piece 4
        tempContainer[4] = line.substring(8,9); //Data piece 5
        tempContainer[5] = line.substring(9,10); //Data piece 6
        tempContainer[6] = line.substring(10,(line.length() - 1)); //Data piece 7



        parsedData.add(tempContainer);
    }
}

所以在之前的版本中,我已将一些外部文件转储到nonParsedData。它是一堆字符串。没什么大不了。我拿这些字符串,读取它们,将它们放入数组中。 Hunky dory。这很好。

这是检索过程,这使我中风。

public static void fetchAndPrint() throws IOException
{
    String[] tempContainer = new String[7];

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

        tempContainer = parsedData.get(x); //this should be assigning my stored array to
                                           //the tempContainer array (I think)

        //let's try deepToString (that didn't work)
        //System.out.println((parsedData.get(x)).toString()); //just a debugging check

        System.out.println(x);
        System.out.println(tempContainer[0] + " " + tempContainer[1] + " " 
            + tempContainer[2] + " " + tempContainer[3] + " " 
            + tempContainer[4] + " " + tempContainer[5] + " " 
            + tempContainer[6] + " ");
    }
}

执行此操作后,只有一个输出显示在初始ArrayList<String[]> - 三次!我在循环中遗漏了什么吗?当我真的没有这个功能时,我是否从ArrayList实现数组?我是否错误地将值分配给数组?请ArrayList甚至会给我一个实际的数组 - 或者它只是一个像{1,2,3等}的列表?这些事情甚至有所不同吗?

最后,我知道这可以使用数据库语言来实现,但我们假设我想坚持使用Java。

2 个答案:

答案 0 :(得分:1)

我会保持简单并回答你的问题:

  

arraylists和数组如何在java中相互交互?

首先,我们必须区分两者。

虽然 数组 (即tempContainer [])只是连续内存中类似数据(基元或对象)的集合,但 ArrayLists 是具有字段和成员函数的对象。

回到你的问题。要从 数组 转换为 ArrayList

String[] names = {"Bobby", "Earl", "Super Mario"};
ArrayList<String> namesList = new ArrayList<String>();

// First we must return the array as a List using Arrays.asList()
// Then use the addAll() method provided by the ArrayList class.
namesList.addAll(Arrays.asList(names));

现在正好相反,将 ArrayList 的内容返回到 数组

String[] names;
ArrayList<String> namesList = new ArrayList<String>();

//All that is needed is the ArrayList member method toArray().
names = namesList.toArray();

我希望这有帮助!

答案 1 :(得分:0)

由于tempContainer的范围,您会覆盖您的值:

String[] tempContainer = new String[7];
for (int x = 0; x < nonParsedData.size(); x++)
{
    line = nonParsedData.get(x);

    //filling the temporary container to place into the ArrayList of arrays
    tempContainer[0] = line.substring(0,1);
    // ...
    parsedData.add(tempContainer); // <=== this is always the same array
}

你可能想要的是每个迭代的全新数组,如下所示:

for (int x = 0; x < nonParsedData.size(); x++)
{ 
   String[] tempContainer = new String[7];
   // fill tempContainer
   parsedData.add(tempContainer);

working demo


作为旁注,您可能希望在此处使用对象:

  • 为部件定义一个对象(让我们称之为Part
  • 为循环的每次迭代创建一个新对象
  • 使用ArrayList<Part> parsedData