2016-12-28 55 views
2

我需要切片地圖。我有這樣的工作:在達特朗切片地圖

Map sliceMap(Map map, offset, limit) { 
    Map result = new Map(); 
    if (map.length < limit) { 
    limit = map.length; 
    } 
    map.keys.toList().getRange(offset, limit).forEach((key) { 
    result[key] = map[key]; 
    }); 
    return result; 
} 

有沒有更有效的方法和/或內置的方式?我在API中找不到任何內容(https://api.dartlang.org/stable/1.21.0/dart-core/Map-class.html)。


從aelayeb解決方案:

Map sliceMap(Map map, offset, limit) { 
    return new Map.fromIterables(
     map.keys.skip(offset).take(limit - offset), 
     map.values.skip(offset).take(limit - offset) 
); 
} 
+0

由於地圖的鑰匙在一個不確定的順序,如何有效將這個實際上是? –

+0

@RandalSchwartz對於'Map',鍵的順序是維護的。例如,像「HashMap」這樣的所有地圖都不是這種情況。 –

+0

保持但未定義。說「增加按鍵順序」,你不能要求切片。因此,這樣的一部分將會有未定義和相對無用的語義。可能最好退後一步,問自己:「爲什麼我需要一個切片?」並找出不需要的答案。 –

回答

2

這是我對什麼是值得的做法:

new Map.fromIterables(
    map.keys.skip(offset).take(limit), 
    map.values.skip(offset).take(limit) 
); 

有了這個,你不必做極限測試。

+0

請注意,限制是相對的,所以在您的情況下它對應於(限制 - 偏移量)。 – aelayeb

1

您可以使用:

Map sliceMap(Map map, offset, limit) { 
    return new Map.fromIterable(map.keys.skip(offset).take(limit), 
     value: (k) => map[k]); 
}