เปลี่ยนรายชื่อของวัตถุต้องรายชื่อของสนาม

0

คำถาม

ฉันมีรายชื่อ[MyObject]กับ MyObject บรรจุในช่องข้อมูล field1,field2 และ field3.

ฉันกำลังมองหาวิธีที่มีประสิทธิภาพของการทำ:

Tuple3(_.map(_.field1), _.map(_.field2), _.map(_.field3))

ในงานจาวาฉันจะทำอะไรอย่าง:

Field1Type f1 = new ArrayList<Field1Type>();
Field2Type f2 = new ArrayList<Field2Type>();
Field3Type f3 = new ArrayList<Field3Type>();


for(MyObject mo : myObjects) {
    f1.add(mo.getField1());
    f2.add(mo.getField2());
    f3.add(mo.getField3());
}

ฉันก็เหมือนบางอย่างมากกว่างานตั้งแต่ฉันอยู่ใน language แต่ฉันไม่สามารถวางนิ่วบนมันได้

scala
2021-11-23 10:53:16
2

คำตอบที่ดีที่สุด

3

ได้ 2\3 รายการย่อยของกลุ่มกัน unzip\unzip3

สมมติว่าที่จุดเริ่มต้น:

val objects: Seq[MyObject] = ???

คุณสามารถถอดซิปให้ทั้ง 3 รายการย่อยของกลุ่ม:

val (firsts, seconds, thirds) =  
  objects
    .unzip3((o: MyObject) => (o.f1, o.f2, o.f3))

แล้วถ้าฉันมีมากกว่า 3 ที่เกี่ยวข้องรายการย่อยของกลุ่ม?

ถ้าคุณต้องการจริงๆมากกรายการย่อยของกลุ่มเธอต้องด้วยอะไรซักอย่างของตัวเอง unzipN แต่แทนที่จะทำงานกับ Tuple22 ฉันจะลงมือด้วยตัวเอง\ต้องการอะแดปเตอร์:


case class MyObjectsProjection(private val objs: Seq[MyObject]) {
  
  lazy val f1s: Seq[String] =
    objs.map(_.f1)

  lazy val f2s: Seq[String] =
    objs.map(_.f2)

    ... 
  
  lazy val f22s: Seq[String] =
    objs.map(_.f3)
}

val objects: Seq[MyClass] = ???
val objsProjection = MyObjectsProjection(objects)

objs.f1s
objs.f2s
...
objs.f22s

บันทึกย่อ:

  • เปลี่ยน MyObjectsProjection ตามที่คุณต้องการ
  • นี่คืออกจากเป็น Language 2.12\2.11 วานิลางทัศนคติ
2021-11-23 13:57:53

สำหรับ language 3 ผู้ใช้:คุณสามารถข้อต่อรองทั่วไป tuple: elements.map(Tuple.fromProductTyped(_)).unzip3
gianluca aguzzi

แล้วถ้าฉันมีมากกว่า 3 ช่องข้อมูลทีหลังได้ไหม
Robert Reynolds

ถึงแม้ว่า MyClass มีมากกว่าช่องข้อมูลคุณสามารถเลือกแค่ 2\3 ช่องข้อมูลที่เกี่ยวข้องกับ unzip\unzip3. คุณต้องเพิ่มของตัวเอง implementations สำหรับที่ใหญ่กว่า tuples หรือแค่คิดใหม่อัลกอริธึ่มของเธอ. TBH แทนที่จะทำงานกับ Tuple20 ฉันจะทำให้เป็นคดีชั้นเรียนอะแดปเตอร์.
gatear

ผมอัพเดทตำแหน่งกับอะแดปเตอร์ทั่วไปเช่นกัน
gatear
2

ต่อไปนี้จะเน่าไปซะก่อนของวัตถุไปสามรายการ:

case class MyObject[T,S,R](f1: T, f2: S, f3: R)

val myObjects: Seq[MyObject[Int, Double, String]] = ???

val (l1, l2, l3) = myObjects.foldLeft((List.empty[Int], List.empty[Double], List.empty[String]))((acc, nxt) => {
  (nxt.f1 :: acc._1, nxt.f2 :: acc._2, nxt.f3 :: acc._3)
})
2021-11-23 11:17:18

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................