2010-05-14 9 views
0

Dire que j'ai les suivantes:Java Object élément Array à chaîne Tableau

Class myclass 
{ 
    public string stra ="", strb = "" 
    myclass(String a, String b){stra=a;strb=b} 
} 


//then in the app I want to do: 

myclass myclassinst1 = new myclass("blah","xxxx"); 
myclass myclassinst2 = new myclass("blah2","yyyy"); 
myclass myclassinst3 = new myclass("blah3","zzzz"); 

list <myclass> mylist = new ArrayList<myclass>(); 
mylist.add(myclassinst1); 
mylist.add(myclassinst2); 
mylist.add(myclassinst3); 

//How would I then convert that to a String[] Array of all the stra elements without using a loop. 
//eg: 
String[] strarr_a = mylist.toarray(myclass.stra); 
String[] strarr_b = mylist.toarray(myclass.strb); 


//instead of having to do 
String[] strarr_a = new String[mylist.size()]; 
String[] strarr_b = new String[mylist.size()]; 
for (int i=0;i<mylist.size();i++) 
{ 
    strarr_a[i] = mylist.get(i).stra; 
    strarr_b[i] = mylist.get(i).strb; 
} 

Répondre

5

Il n'y a pas de moyen facile de le faire, par exemple avec une méthode API Java standard. Vous devrez écrire la boucle vous-même.

Notez qu'il existe un certain nombre d'erreurs dans votre code (manquant des points-virgules, les noms de classe mal orthographiés tels que string et list, et le mot-clé est class, pas Class).

je l'écrire quelque chose comme ceci:

class MyClass { 
    // Note that it's bad practice to make fields public. 
    // Also, you do not need to initialize fields to "" if you're going to initialize them in the constructor. 
    private String stra; 
    private String strb; 

    public MyClass(String a, String b) { 
     this.stra = a; 
     this.strb = b; 
    } 

    public String getStra() { 
     return stra; 
    } 

    public String getStrb() { 
     return strb; 
    } 
} 

MyClass myclassinst1 = new MyClass("blah","xxxx"); 
MyClass myclassinst2 = new MyClass("blah2","yyyy"); 
MyClass myclassinst3 = new MyClass("blah3","zzzz"); 

List<MyClass> mylist = new ArrayList<MyClass>(); 
mylist.add(myclassinst1); 
mylist.add(myclassinst2); 
mylist.add(myclassinst3); 

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

for (MyClass obj : mylist) { 
    list1.add(obj.getStra()); 
    list2.add(obj.getStrb()); 
} 

String[] strarrA = list1.toArray(new String[list1.size()]); 
String[] strarrB = list2.toArray(new String[list2.size()]); 
+0

Ok Comme je l'ai pensé que c'est la façon dont je dois le garder. En passant, le code était juste un exemple de ce que j'essayais de faire, pas du code réel. – DGoulston

0

Il n'y a pas construit en méthode pour briser ce, vous devrez le faire manuellement avec la boucle.

(Soit dit en passant, vos conventions de nommage ne sont pas très standard ... par exemple MyClass, myClassInst1, myList, etc. De meilleurs choix.)

0

Cela nécessitera une boucle. Il n'y a pas de fonctionnalité intégrée pour le faire en Java.

+2

Alors ... ce que Jesper et froadie ont dit, alors. –

2

Il existe des bibliothèques qui fournissent des wrappers fonctionnels pour ce genre de choses. J'ai utilisé http://functionaljava.org/ mais c'est une question de goût.

import fj.data.List 
import fj.F 

// Creation of myclassinst1, myclassinst2, myclassinst3 as above 

List<myclass> mylist = List.list(myclassinst1, myclassinst2, myclassinst3); 

List<String> strarr_a = mylist.map(new F<myclass, String>() { 
    String f(myclass c) { return c.stra } 
}); 

List<String> strarr_b = mylist.map(new F<myclass, String>() { 
    String f(myclass c) { return c.strb } 
}); 

Gardez à l'esprit ces List s sont de functionaljava, et non les natifs Java List s. Ils peuvent être convertis en ArrayLists si nécessaire.

+0

"Gardez à l'esprit que ces listes proviennent de functionaljava, pas des listes Java natives, elles peuvent être converties en ArrayLists si nécessaire." Tant que c'est l'interface Java 'List' standard, cela aurait-il vraiment de l'importance? – Powerlord

+0

Parce que ce n'est pas :) Il ne fait qu'implémenter 'Iterable'. – RoToRa

0
class MyClass { 
    string a; 
    string b; 

    //...etc 
} 

//now pretend you have: Collection<MyClass> myClasses 

String[] myAs = (String[]) CommonUtils.collect(myClasses, new Transformer() { 
        public Object transform(Object o) { 
         return ((MyClass)o).getA(); 
        } 
       }).toArray(); 

voir, qui dit que vous avez besoin de plus d'une ligne :)? CollectionUtils est une partie d'Apache Commons (qui bascule) et pas core java, cependant.

Lien: http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html