2016-06-22 1 views
0

は私がリスト件のデータが内部で以下のようなものです[T]があります。リスト[T]のいくつかのキー値ペアをスカラーで保持する方法は?

[0]- id : "abc", name: "xyz", others: "value" 
[1]- id : "bcd", name: "dsf", others: "value" 

は、今私は同じリスト[T]を返すようにしたいのですが、idと名前を返すリストになります。すなわち:

[0]- id : "abc", name: "xyz" 
[1]- id : "bcd", name: "dsf" 

私は以下のコードで試してみました:

var temps = templates.map(x => List("id" -> x.id, "name" -> x.name)) 

しかし、それはリストすなわち内部のリストを生成します。

[0]- 
    [0] id : "abc" 
    [1] name: "xyz" 
[1]- 
    [0] id : "bcd" 
    [1] name: "dsf" 

タプルでも無駄にしました。どのようにIDと名前の値のペアを除いてすべてが消去されるようにリストをマップするだけですか?あなただけidname分野で新しいクラスを定義する場合を除き、私はタプルが最善の策だと思う

答えて

1

scala> case class obj(id: String, name: String, others: String) 
defined class obj 

scala> val l = List(new obj("abc", "xyz", "value"), new obj("bcd", "dsf", "value")) 
l: List[obj] = List(obj(abc,xyz,value), obj(bcd,dsf,value)) 

scala> l.map(x => (x.id, x.name)) 
res0: List[(String, String)] = List((abc,xyz), (bcd,dsf)) 

はまた、あなたが実際に、あなたの例では->をタプルを使用しています構文はScalaでタプルを作成します。

:ここ

scala> "a" -> "b" 
res1: (String, String) = (a,b) 

"別のクラスを定義する" オプションがあります

scala> case class obj2(id: String, name: String){ 
    | def this(other: obj) = this(other.id, other.name) 
    | } 
defined class obj2 

scala> l.map(new obj2(_)) 
res2: List[obj2] = List(obj2(abc,xyz), obj2(bcd,dsf)) 
+0

はケースクラスのOBJのない方法はあります? –

+0

私は説明の目的でこれを追加しました。 '.'演算子を使ってオブジェクトからプロパティを取得したい場合(' x.id'のように)、そのフィールドでクラスを定義する必要があります。 –

+0

あなたは '地図'について話しているように聞こえると思いますか? [this](http://pastebin.com/YTtdb8Tz)は何をしようとしていますか?そうでない場合はスカラスタイルではないので、誰かが地図にスローするのではなく、ケースクラスに明示的にフィールドを定義するのが最善です。 –

0

あなたのリストには、ID、名前、その他の3人のメンバーを持つオブジェクトが含まれていることはかなり明白だと思います。したがって、あなたは、私はそんなにわからない何

{X => x.name}

を使用してそれらにアクセスする、あなたの最終結果を想像する方法です。あなたは明らかに、メンバーを保持するいくつかのデータ構造が必要です。 あなたは、新しいリストの中のリストに各オブジェクトのメンバーを格納するのはあまりいいことではないが、タプルではうまくいかないように思えます。

私は想像することができますが、タプルはあなたが望むものです。このような連想リストで

val newList = oldList.map{e => e.id -> e.name} 

結果:

リスト(( "ID_A"、 "name_a")、( "ID_B"、 "name_b")、( "ID_C"、 "name_c") )

例えば(このようにアクセスすることができる):最初のタプルIDの

newList.head._1 

、及び

newList.head._2 

最初のタプル名です。

あなたが最初の場所で何をしたい、これはかなりのように見えるので、可能性がマップにマッピングすることが別のオプション、:返しnewMap.get("key")

newMap = oldList.map{e => e.id -> e.name}.toMap 

この方法であなたはこのnewMap("key")またはより安全などのメンバーにアクセスすることができますオプションがあり、キーが存在しない場合は例外として終わることはありません。

1

List[T]は、あなたが次のことを行うことができるかもしれList[Map]、であることを考える:

//Remove the "others" key. 
val temps = templates.map(map => {map - "others"}) 
+0

または単に 'templates.map(_ - " others ")' – jwvh

関連する問題