2012-06-10 2 views
4

Я получаю эту ошибку:ClassCastException: ArrayList не может быть приведен в строку

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String

Это код:

public static List<String>produit_cart(ArrayList l) 
{ 
    List<String>re=new ArrayList(); 
    List<String>l4=new ArrayList(); 

    re=(List<String>) l.get(0); 

    for(int i=1;i<l.size();i++) 
    { 
     l4=new ArrayList(); 

     for(int j=0;j<re.size();j++) 
     { 
      for(int k=0;k<((ArrayList)l.get(i)).size();k++) 
      { 
       l4.add(re.get(j) + 
         " " + 
         (String)((ArrayList)l.get(i)).get(k)); 

      } 
     } 

     re=new ArrayList(); 
     for(int m=0;m<l4.size();m++) 
     { 
      re.add(l4.get(m)); 
     } 
    } 

    return re; 
} 

Проблема заключается в этой строке:

l4.add(re.get(j)+" "+(String)((ArrayList)l.get(i)).get(k)); 

I попытался переписать его как:

l4.add(re.get(j)+" "+((ArrayList)l.get(i)).get(k)); 

но это не сработало. Что мне делать ?

+11

Почему вы не используете дженерики по обе стороны от ваших объявлений? Почему ваши имена переменных не являются полезными? –

+0

Вторая «попытка» не вызывает этого исключения ... –

+3

Вам необходимо функционально разложить это. Назовите вещи ортогональным образом (как упоминалось выше), добавьте некоторые комментарии, где вещи не очевидны и согласуются с вашим использованием дженериков. На данный момент три петли глубоко, этот код просто не имеет смысла. Если вы сделаете это читаемым, ответ выскочит на вас. –

ответ

9

У вас возникли проблемы с вашими круглыми скобками.

Вы хотите позвонить get(i) и get(k) на свой ArrayList, а затем передать его String.

Ваш код выдает результат l.get(i) на номер String, затем пытается вызвать на нем get(k).

... На самом деле, я едва могу определить, что делает ваш код, потому что его трудно прочитать в текущем состоянии.

Следующие должны работать, а также сделать ваш код намного проще следовать:

ArrayList tempList = (ArrayList) l.get(i); 
String tail = (String) tempList.get(k); 
l4.add(re.get(j) + " " + tail; 

Одна вещь, которая бы действительно помощь будет обеспечивать этот список l является list of string lists. Тогда вам не придется бросать вообще. Вы можете achive, что с помощью следующей декларации (если вообще возможно):

List<ArrayList<String>> listL = new ArrayList<ArrayList<String>>(); 

Вот несколько советов о том, как вы могли бы переписать выше и сделать его намного легче следовать:

public static List<String> produitCart(List<ArrayList<String>> listOfLists) 
{ 
    List<String> returnList = listOfLists.get(0); 

    for (int i = 1; i < listOfLists.size(); i++) { 

     List<String> listFour = new ArrayList<String>(); 

     for (int j = 0; j < returnList.size(); j++) { 
      ArrayList<String> tempList = listOfLists.get(i); 
      for (int k = 0; k < tempList.size(); k++) { 
       listFour.add(returnList.get(j) + " " + tempList.get(k)); 
      } 
     } 

     returnList = new ArrayList(); 

     for (int m = 0; m < listFour.size(); m++) { 
      returnList.add(listFour.get(m)); 
     } 
    } 

    return returnList; 
}