0

私が次を持っているとしましょう:

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

5 に答える 5

5

たとえば、標準のJava APIメソッドを使用して、これを行う簡単な方法はありません。ループは自分で作成する必要があります。

コードにはいくつかのエラーがあることに注意してください(セミコロンの欠落、andなどのスペルミスのあるクラス名stringlistおよびキーワードはclass、ではありませんClass)。

私はそれを次のように書きます:

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()]);
于 2010-05-14T13:43:43.667 に答える
2

このようなもののための機能的なラッパーを提供するライブラリがあります。私はhttp://functionaljava.org/を使用しましたが、それは好みの問題です。

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

Listこれらは、ネイティブJavaではなく、functionaljavaからのものであることに注意してくださいList。必要に応じて変換できArrayListsます。

于 2010-05-14T14:04:07.050 に答える
0

これを分割するための組み込みのメソッドはありません。ループを使用して手動で実行する必要があります。

(ちなみに、命名規則はあまり標準的ではありません...たとえば、MyClass、myClassInst1、myListなどがより適切な選択です。)

于 2010-05-14T13:44:51.190 に答える
0

これにはループが必要です。Javaでこれを行うための組み込み機能はありません。

于 2010-05-14T13:48:09.250 に答える
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();

ほら、誰があなたが複数の行が必要だと言っていますか:)?ただし、CollectionUtilsはApache Commons(ロック)の一部であり、コアJavaではありません。

リンク:http ://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html

于 2010-05-14T16:59:10.890 に答える