Создание ArrayList в ArrayList - PullRequest
1 голос
/ 19 июля 2011

Итак, для программы, над которой я работаю, я пытаюсь создать метод, который будет анализировать текстовый файл. Используя значения в текстовом файле, создайте 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 ]

5 голосов
/ 19 июля 2011

Я предлагаю вам использовать отладчик, чтобы точно увидеть, что происходит.

После прочтения кода, я думаю, он читает первую строку нормально, но завершается неудачно после этого момента, потому что вы добавляете только один вложенный ArrayList, но пытаетесь использовать многие из них.

Самое простое, что нужно сделать - вернуть Map , поскольку я предполагаю, что первый столбец уникален.

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;
}
3 голосов
/ 19 июля 2011

Создайте два массива. Заполните их .. затем добавьте их в свой другой список.

Как говорится, это должен быть arraylist? Разве вы не можете иметь обычный объект, содержащий два разных массива? Еще лучше, может быть, вы хотите рассмотреть другую структуру данных, например, карту?

    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);
    }       
1 голос
/ 19 июля 2011

Я согласен с Питером Л. - обязательно используйте реализацию Map. Я использовал TreeMap для тестирования, так как это отсортированная карта, но вы можете использовать любую карту, какую захотите. Я также проверил это, чтобы убедиться, что оно работает.

Из вашего описания я считаю, что это то, что вы хотите:

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, к которому затем добавляет значение.

Надеюсь, это то, что вы хотите!

1 голос
/ 19 июля 2011

Я думаю, что лучший способ сделать это - использовать любую из уже существующих библиотек для чтения из файлов CSV. Это сделает ваш код намного проще.

...