【问题标题】:sort two lists by their first element and zip them in scala按两个列表的第一个元素对它们进行排序并在 scala 中压缩它们
【发布时间】:2014-10-13 19:15:46
【问题描述】:
 val descrList = cursorReal.interfaceInfo.interfaces.map {
    case values => (values.ifIndex , values.ifName , values.ifType)
  }

 val ipAddressList = cursorReal.interfaceIpAndIndex.filter(x=> (!x.ifIpAddress.equalsIgnoreCase("0"))).map {
    case values => (values.ifIndex,values.ifIpAddress)
  }

例如,

val descrList = 
  List((12,"VoIP-Null0",1), (8,"FastEthernet6",6), (19,"Vlan11",53),
       (4,"FastEthernet2",6), (15,"Vlan1",53), (11,"GigabitEthernet0",6),
       (9,"FastEthernet7",6), (22,"Vlan20",53), (13,"Wlan-GigabitEthernet0",6), 
       (16,"Async1",1), (5,"FastEthernet3",6), (10,"FastEthernet8",6), 
       (21,"Vlan12",53), (6,"FastEthernet4",6), (1,"wlan-ap0",24), 
       (17,"Virtual-Template1",131), (14,"Null0",1), (20,"Vlan10",53), 
       (2,"FastEthernet0",6), (18,"NVI0",1), (7,"FastEthernet5",6), 
       (29,"Virtual-Access7",131), (3,"FastEthernet1",6), (28,"Virtual-Access6",131))

val ipAddressList = List((21,"192.168.12.1"), (19,"192.168.11.1"), 
                         (11,"104.36.252.115"), (20,"192.168.10.1"), 
                         (22,"192.168.20.1"))

在这两个列表中,第一个元素是索引,我必须明智地合并这两个列表索引。它的意思是 (21,"192.168.12.1") 这个 ipAddress 应该与 (21,"Vlan12",53) 合并并形成如下的新列表 (21,"Vlan12",53,"192.168.12.1")

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:
    scala> descrList map {case (index, v1, v2) =>
       (index, v1, v2, ipAddressList.toMap.getOrElse(index, "empty"))}
    res0: List[(Int, String, Int, String)] = List(
    (12,VoIP-Null0,1,empty), (8,FastEthernet6,6,empty), (19,Vlan11,53,192.168.11.1), 
    (4,FastEthernet2,6,empty), (15,Vlan1,53,empty), (11,GigabitEthernet0,6,104.36.252.115), 
    (9,FastEthernet7,6,empty), (22,Vlan20,53,192.168.20.1), (13,Wlan-GigabitEthernet0,6,empty), 
    (16,Async1,1,empty), (5,FastEthernet3,6,empty), (10,FastEthernet8,6,empty), 
    (21,Vlan12,53,192.168.12.1), (6,FastEthernet4,6,empty), (1,wlan-ap0,24,empty), (17,Virtual-
    Template1,131,empty), (14,Null0,1,empty), (20,Vlan10,53,192.168.10.1), (2,FastEthernet0,6,empty),
    (18,NVI0,1,empty), (7,FastEthernet5,6,empty), (29,Virtual-Access7,131,empty),
    (3,FastEthernet1,6,empty), (28,Virtual-Access6,131,empty))
    

    【讨论】:

      【解决方案2】:

      首先,我建议您生成地图而不是列表。 Map 本质上具有索引器,在您的情况下,这将是 ifIndex 值。

      一旦你有了地图,你就可以使用这样的东西(来自其他 SO Best way to merge two maps and sum the values of same key? 的示例)

      来自雷克斯科尔: map1 ++ map2.map{ case (k,v) => k -> (v + map1.getOrElse(k,0)) }

      或者像马修·法威尔这样的: (map1.keySet ++ map2.keySet).map (i=> (i,map1.getOrElse(i,0) + map2.getOrElse(i,0))}.toMap

      如果您出于某种原因无法使用地图,请查看您现有的项目库。如果你有 Scalaz,那么你已经有了一些可用的工具。

      斯卡拉兹:https://github.com/scalaz/scalaz

      如果你有 Slick,你也有一些不错的工具可以直接使用。

      光滑:http://slick.typesafe.com/docs/

      【讨论】:

        【解决方案3】:

        考虑首先将decrList 转换为Map,像这样,

        val a = (for ( (k,v1,v2) <- descrList) yield k -> (v1,v2)).toMap
        

        然后我们可以查找ipAddressList的键并将元素聚合成一个新的元组,如下所示,

        for ( (k,ip) <- ipAddressList ; v = a.getOrElse(k,("none","none")) ) yield (k,v._1,v._2,ip)
        

        因此,对于ipAddressList

        res: List((21,Vlan12,53,192.168.12.1), (19,Vlan11,53,192.168.11.1), 
                  (11,GigabitEthernet0,6,104.36.252.115), (20,Vlan10,53,192.168.10.1),
                  (22,Vlan20,53,192.168.20.1))
        

        【讨论】:

          【解决方案4】:

          给定数据:

          val descrList =
            List((12, "VoIP-Null0", 1), (8, "FastEthernet6", 6), (19, "Vlan11", 53),
              (4, "FastEthernet2", 6), (15, "Vlan1", 53), (11, "GigabitEthernet0", 6),
              (9, "FastEthernet7", 6), (22, "Vlan20", 53), (13, "Wlan-GigabitEthernet0", 6),
              (16, "Async1", 1), (5, "FastEthernet3", 6), (10, "FastEthernet8", 6),
              (21, "Vlan12", 53), (6, "FastEthernet4", 6), (1, "wlan-ap0", 24),
              (17, "Virtual-Template1", 131), (14, "Null0", 1), (20, "Vlan10", 53),
              (2, "FastEthernet0", 6), (18, "NVI0", 1), (7, "FastEthernet5", 6),
              (29, "Virtual-Access7", 131), (3, "FastEthernet1", 6), (28, "Virtual-Access6", 131))
          
          val ipAddressList = List((21, "192.168.12.1"), (19, "192.168.11.1"),
            (11, "104.36.252.115"), (20, "192.168.10.1"),
            (22, "192.168.20.1"))
          

          合并和排序:

          val addrMap = ipAddressList.toMap
          
          val output = descrList
            .filter(x => addrMap.contains(x._1))
            .map(x => x match { case (i, a, b) => (i, a, b, addrMap(i)) })
            .sortBy(_._1)
          
          output foreach println
          

          输出:

          (11,GigabitEthernet0,6,104.36.252.115)
          (19,Vlan11,53,192.168.11.1)
          (20,Vlan10,53,192.168.10.1)
          (21,Vlan12,53,192.168.12.1)
          (22,Vlan20,53,192.168.20.1)
          

          【讨论】:

            猜你喜欢
            • 2022-10-04
            • 2020-01-02
            • 1970-01-01
            • 2016-12-19
            • 1970-01-01
            • 2011-12-30
            • 2023-03-18
            • 2010-10-22
            • 2021-01-05
            相关资源
            最近更新 更多