tags:

views:

96

answers:

5

Say I have the following:

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;
}
+5  A: 

There is no easy way to do this, for example with a standard Java API method. You will have to write the loop yourself.

Note that there are a number of errors in your code (missing semi-colons, misspelled class names such as string and list, and the keyword is class, not Class).

I'd write it something like this:

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()]);
Jesper
Ok so As I thought this is the way I have to keep it. by the way, the code was just an example of what I was trying to do, not actual code.
A: 

There's no built in method to break this up, you would have to do it manually with the loop.

(By the way, your naming conventions aren't very standard... e.g. MyClass, myClassInst1, myList, etc. would be better choices.)

froadie
A: 

This will require a loop. There is no built in functionality to do this in Java.

Andrew Hubbs
So...what Jesper and froadie said, then.
T.J. Crowder
+2  A: 

There are libraries that provide functional wrappers for things like this. I've used http://functionaljava.org/ but it's a matter of taste.

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 } 
});

Keep in mind these Lists are from functionaljava, not the native Java Lists. They can be converted to ArrayLists if needed.

RoToRa
"Keep in mind these Lists are from functionaljava, not the native Java Lists. They can be converted to ArrayLists if needed." As long as that's the standard Java `List` interface, would it really matter?
R. Bemrose
Because it's not :) It only implements `Iterable`.
RoToRa
A: 
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();

see, who says you need more than one line :) ? CollectionUtils is a part of Apache Commons (which rocks) and not core java, however.

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

John