53

両方とも文字列型の2つのフィールドfield1とを持つオブジェクトのリストがあるとします。field2

field1可能であれば、リストを反復処理せずにすべての値のリストを取得するにはどうすればよいですか?

4

12 に答える 12

81

幸い、Java8を使用してこれを行うことができます-Streams

YourEntityという名前のエンティティがあると仮定します

public class YourEntity {

    private String field1;
    private String field2;

    public YourEntity(String field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    public String getField1() {
        return field1;
    }

    public String getField2() {
        return field2;
    }
}

以下を使用してYourEntityのリストを宣言します。

List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));

この方法で、 field1のリストを1回のショットで抽出できます。

import java.util.stream.Collectors;

List<String> field1List = entities.stream().map(YourEntity::getField1).collect(Collectors.toList());

またはこのように

import java.util.stream.Collectors;

List<String> field1List = entities.stream().map(urEntity -> urEntity.getField1()).collect(Collectors.toList());

java8を使用してすべてのアイテムを印刷することもできます:)

field1List.forEach(System.out::println);

出力

text1
text3
于 2017-02-07T14:41:35.147 に答える
9

これを試して:

List<Entity> entities = getEntities();
List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.class).getFielf1());

LambdaJを使用すると、明示的なループなしでコレクションにアクセスできるため、リストを自分で繰り返すためのコード行を増やす代わりに、LambdaJにアクセスさせることができます。

于 2012-06-12T13:01:24.363 に答える
8

オブジェクトは、メモリアドレスへの参照です。次に、このオブジェクトのフィールドは、他のメモリアドレスへの他の参照です。したがって、オブジェクトのリストは参照のリストです。したがって、リストがオブジェクトフィールド(参照によって指定された参照)に直接アクセスすることは不可能です。簡単な答えはノーです。

注:とにかく、必要なことを実行するAPIが見つかりますが、それでも内部でループします。

于 2012-06-12T13:02:01.743 に答える
5

依存します...

...あなたの質問が次のいずれかに言及しているかどうavoiding iterating over the collectionか:

  • コールポイントでの実装の容易さの観点から
  • または アルゴリズムの複雑さの観点から

具体的には、次のような意味ですか。

  • 反復構造を自分で入力したくない場合(単にコンビニエンスライブラリを使用するだけです)、
  • または、実際には、要素を処理する必要なしに(そして完全にアクセスできるように)O(1)で自動的に要素を返す何かが必要ですか?

ソリューションとオプションについては、以下を参照してください。


コンビニエンスライブラリの使用

それが最初のものである場合は、Google Guava、LambdaJ、FunctionalJava、または基本的な機能構造を実装し、いくつかの表現力豊かな呼び出しで必要なことを実行できるその他のライブラリを調べてください。ただし、これらは缶に書かれていることを実行することを覚えておいてください。コレクションをフィルタリング、収集、または変換し、その要素を反復処理してこれを実行します。

例えば:

  • Google Guava

    Set<String> strings = buildSetStrings();  
    Collection<String> filteredStrings =
        Collections2.filter(strings, Predicates.containsPattern("^J"));  
    
  • 機能的なJava

    Array<Integer> a = array(97, 44, 67, 3, 22, 90, 1, 77, 98, 1078, 6, 64, 6, 79, 42);
    Array<Integer> b = a.filter(even);
    
  • LambdaJ

    List<Integer> biggerThan3 = filter(greaterThan(3), asList(1, 2, 3, 4, 5));
    

完璧なアクセス

2番目の場合、これはそのままでは不可能ですただし、最初からすべてをアーキテクチャ化して、挿入時にフィールド値に基づいてオブジェクトにインデックスを付けるカスタムコレクションクラスによってオブジェクトを管理する必要がある場合を除きます。

リストとして取得したり、オンデマンドで設定したりできるように、上記の値でインデックス付けされたバケットにそれらを保持します。

dounyyの回答の下のコメントで述べられているように、そのようなカスタムコレクションを設計すると、受け入れる要素のAPIに影響を与える可能性があります(要素タイプに使用するスーパーインターフェイスを定義することによって)、またはかなり複雑な実装が必要になりますこのコレクションを汎用にしたい場合は、メンバーを動的に解決します(ほとんどの場合、リフレクションを使用します)。

于 2012-06-12T13:07:11.307 に答える
4

言語としてのJavaもJDKライブラリも、まだあなたが望むことをしていません。LambdaJを使用するか、ラムダ式が含まれると予想されるJava8を待つことができます。

于 2012-06-12T13:02:11.807 に答える
2

古代の質問ですが、私は同様の解決策を改善できるかどうかを探しているときにそれに出くわしました。

List<String>肉付けを作成せずにインターフェースを実装できるためArrayList<String>、親オブジェクトを反復処理する必要はありません。

final List<Entity> entities = getEntities()
final List<String> field1 = new AbstractList() {
    public String get(int index) {
        return entities.get(index).getField1();
    }
    public int size() {
        return entities.size();
    }
}

これにより、親オブジェクトを反復処理せずにリストが得られます。

派生物へのList<String>ランダムアクセスは、基礎となるものへのランダムアクセスと同じくらい費用がかかりList<Entity>ます。List<Entity>迅速なランダムアクセスを提供しない実装を使用している場合は、いくつかのフープをジャンプする必要があるかもしれません(つまり、より多くのメソッドを実装しますList<String>。ただし、これは、軽量が必要な場合の99%で機能するはずです。アダプタ。

于 2014-01-21T17:27:09.570 に答える
2

オブジェクトを次のクラスにします。

public class Bike {

    String bikeModel;
    Int price;
}

そして今、タイプリストのbikeListと呼ばれるバイクのリストがあります

したがって、上記のリストにあるすべての自転車の自転車モデルのリストが必要です。

bikeList.map{ Bike b -> b.bikeModel }.toCollection(arrayListOf())

BikeList内のすべてのバイクオブジェクトの最初のフィールドの配列リストを返します

于 2018-10-29T11:45:10.703 に答える
1

はい!!それが可能だ。しかし、あなたはいくつかの曲がった仕事をしなければなりません。

  1. 必要な変数を使用して内部クラスを作成します。例:ここでは2つの変数(TNAMEとTABTYPE)を使用します。

     public class storeTables {
            private String tablename = "";
            private String tabletype = "";
            public storeTables(String a, String b)
            {
                this.setTablename(a);
                this.setTabletype(b);
            }
            public void setTablename(String tablename) {
                this.tablename = tablename;
            }
            public String getTablename() {
                return tablename;
            }
            public void setTabletype(String tabletype) {
                this.tabletype = tabletype;
            }
            public String getTabletype() {
                return tabletype;
            }}
    
  2. 上で作成した内部クラスのリストを作成し、それをカプセル化することを忘れないでください。

    private List<storeTables> objlist= new ArrayList<storeTables>();
    
  3. リストに格納されている値を内部クラスオブジェクトとして取得します。

    String Query="SELECT * FROM TAB";
    while(rs.next())
    {
    String tname=rs.getString("TNAME");
    String tabtype=rs.getString("TABTYPE");
    getObjlist().add(new storeTables(tname,tabtype));
            }
    
  4. DATAMODELを作成し、リストをデータモデルにプッシュします

    private DataModel selectableItems= new ListDataModel(objlist);
    
  5. ワープしたデータを別のリストに取得します。

    List<storeTables> items= (List<storeTables>)selectableItems.getWrappedData();
    
  6. ついに!!!データを印刷します。

    for(storeTables item:items){
    System.out.println(item.getTablename());
        }
    

多田!!!! タブタイプではなく、テーブル名のみが出力されます;)Javaでは不可能なことは何もないと信じてください。

于 2013-04-05T12:50:49.197 に答える
0

いいえ、できません。リスト全体をトラバースして、各オブジェクトから各「field1」値を取得する必要があります。

于 2012-06-12T13:01:15.370 に答える
0

たぶん、あなたはこの方法でハッシュマップを作成することができます:

HashMap<String, ArrayList<Object>> map;

キーはフィールドになります。このようにすると、HashMapに目的のフィールドに対応するオブジェクトを取得するように要求すると、マップはそのフィールドを持つすべての要素をまとめたArrayListを返します。

于 2012-06-12T13:04:14.383 に答える
0

反復せずにこれを行うことはできません。何らかの方法で反復を減らすことはできますが、必須です。

于 2012-06-12T13:06:58.820 に答える
0

異なるリストのレコードの値を追加し、1つまたは2つのイテレータを使用して、次のように個別の値を出力するだけです。

rs=st.executeQuery("select * from stu");
List data=new ArrayList();
List data1=new ArrayList();
while(rs.next())
{
   data.add(rs.getString(1));
   data1.add(rs.getString(2));
}
Iterator it=data.iterator();
Iterator it1=data1.iterator();
while(it1.hasNext())
{
   System.out.println(" "+it.next()+"  "+it1.next());
}
于 2013-03-12T03:37:09.507 に答える