在ArrayList中创建ArrayList

时间:2011-07-18 20:18:16

标签: java arraylist nested text-files nested-class

因此,对于我正在处理的程序,我正在尝试创建一个解析文本文件的方法。使用文本文件中的值,在ArrayList内创建ArrayList。到目前为止,这是我的代码:

public ArrayList<ArrayList<String>> getRels(String relsFile)
{
   String[] currentId;
   int i = -1;

   ArrayList<ArrayList<String>> relsList = new ArrayList<ArrayList<String>>();
   relsList.add(new ArrayList<String>());

   try
   {
      // Open the file that is the first 
      // command line parameter
      FileInputStream fstream = new FileInputStream(relsFile);
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
      String strLine;

      while ((strLine = br.readLine()) != null)
      {
         // Add values to array list
         currentId = strLine.split(",");
         relsList.get(++i).add(currentId[0]);
         //???????????          
      }   
      //Close the input stream
      in.close();
   }        
   catch (Exception e)
   {
      System.err.println("Error: " + e.getMessage());
   }
   return relsList; 
}

这是我正在查看的文本文件的示例。

rId13,image3
rId18,image8
rId26,image16
rId39,image29
rId21,image11
rId34,image24
rId7,image1
rId12,image2
rId17,image7
rId25,image15
rId33,image23
rId38,image28
rId16,image6
rId20,image10
rId29,image19
rId24,image14
rId32,image22
rId37,image27
rId15,image5
rId23,image13
rId28,image18
rId36,image26
rId19,image9
rId31,image21
rId14,image4
rId22,image12
rId27,image17
rId30,image20
rId35,image25

基本上,我希望能够分割值,将所有rId值存储在第一个ArrayList中,然后在嵌套image中列出相应的ArrayList值}。但是,我有点卡住,不知道该做什么。有人可以帮帮我吗?我感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:5)

我建议你使用调试器来确切了解发生了什么。

通过阅读代码,我猜它会读取第一行,但在此之后失败,因为您只添加了一个嵌套的ArrayList,但尝试使用其中的许多。

最简单的方法是返回Map&lt; String,String&gt;因为我认为第一列是独一无二的。

public static Map<String, String> getRels(String relsFile) {
    Map<String, String> map = new LinkedHashMap<String, String>();
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(relsFile));
        String line;
        while ((line = br.readLine()) != null) {
            String[] parts = line.split(",", 2);
            if (parts.length > 1)
                map.put(parts[0], parts[1]);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null) br.close();
        } catch (IOException ignored) {
        }
    }
    return map;
}

答案 1 :(得分:3)

创建两个arraylists。填充它们然后将它们添加到您的其他arraylist中。

话虽如此,这是否必须是一个arraylist?难道你不能只有一个包含两个不同的arraylists的常规对象吗?更好的是,您可能想要考虑一种不同的数据结构,如Map?

    try
    {
        // Open the file that is the first 
        // command line parameter
        FileInputStream fstream = new FileInputStream(relsFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;

        ArrayList<String> list1 = new ArrayList<String>();
        ArrayList<String> list2 = new ArrayList<String>();

        while ((strLine = br.readLine()) != null)
        {
            // Add values to array list
            currentId = strLine.split(",");
            list1.add(currentId[0]);
            list2.add(currentId[1]);

        }     
        //Close the input stream
        in.close();

       relsList.add(list1);
       relsList.add(list2);
    }       

答案 2 :(得分:1)

我认为执行此任务的更好方法是使用任何现有库来读取CSV文件。这将使您的代码更简单。

答案 3 :(得分:1)

我同意Peter L--绝对使用Map实现。我使用TreeMap进行测试,因为它是一个有序的Map,但你可以使用你想要的Map。我也对此进行了测试以确保它有效。

根据您的描述,我相信这就是您想要的:

public TreeMap<String, ArrayList<String>> getRels(String relsFile)
{
    String[] currentId;
    int i = -1;

    TreeMap<String, ArrayList<String>> relsList = new TreeMap<String, ArrayList<String>>();

    try
    {
        // Open the file that is the first 
        // command line parameter
        FileInputStream fstream = new FileInputStream(relsFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;

        while ((strLine = br.readLine()) != null)
        {
            // Add values to array list
            currentId = strLine.split(",");
            if(relsList.containsKey(currentId[0])) {
                relsList.get(currentId[0]).add(currentId[1]);
            } else {
                relsList.put(currentId[0], new ArrayList<String>());
                relsList.get(currentId[0]).add(currentId[1]);
            }

        }     
        //Close the input stream
        in.close();
    }       
    catch (Exception e)
    {
        System.err.println("Error: " + e.getMessage());
    }
    return relsList;    
}

public static void main(String[] args) {
    ListReader lr = new ListReader();
    TreeMap<String, ArrayList<String>> l = lr.getRels("test.txt");
    for(String s : l.keySet()) {
        for(String k : l.get(s)) {
            System.out.println("Key: " + s + " Value: " + k);
        }
    }
}

我在解析部分所做的是使用简单的IF ... ELSE语句解析文件。它检查密钥是否已经存在(rId部分),如果确实存在,它只是将右边的值添加到现有的ArrayList中。如果没有,它会添加一个新密钥,然后创建一个ArrayList,然后将该值添加到。

希望这就是你想要的!