2015-06-23 12 views
5

Tôi muốn nhận bất kỳ cặp khóa/giá trị nào từ mảng kết hợp và xóa nó. Trong python đó là:Có phương pháp nào giống như popitem python cho mảng kết hợp trong dlang không?

key, value = assoc.popitem() 

Trong D Tôi làm:

auto key = assoc.byKey.front; 
auto value = assoc[key]; 
assoc.remove(key); 

Có cách nào tốt hơn để làm điều này? Có thể sử dụng byKeyValue() bên ngoài foreach không?

DMD 2.067.1

+0

Có, Bạn có thể sử dụng byKeyValue() bên ngoài foreach, và đó có lẽ là cách tốt nhất để làm những gì bạn muốn. 'assoc.byKeyValue(). popFront()' ... – DejanLekic

+0

@DejanLekic bạn nên viết như một câu trả lời, lưu trữ phạm vi byKeyValue là một giải pháp khá thanh lịch. –

+0

Tôi đã quá chậm. Câu trả lời của bạn và CyperShadow là đủ tốt. :) – DejanLekic

Trả lời

4

Có thể sử dụng byKeyValue() bên ngoài foreach?

chắc:

import std.stdio; 

void main() 
{ 
    int[string] assoc = ["apples" : 2, "bananas" : 4]; 

    while (!assoc.byKeyValue.empty) 
    { 
     auto pair = assoc.byKeyValue.front; 
     assoc.remove(pair.key); 
     writeln(pair.key, ": ", pair.value); 
    } 
} 

Có cách nào tốt hơn để làm điều này?

Tôi không nghĩ D có hàm thư viện tương đương với popitem.

4

Trước khi thậm chí suy nghĩ về nó, tôi muốn chỉ ra rằng bạn có thể viết một hàm đơn giản:

import std.typecons; 

Tuple!(K, V) popitem(K, V)(ref V[K] arr) { 
    foreach(k, v; arr) { 
     arr.remove(k); 
     return tuple(k, v); 
    } 
    throw new Exception("empty!"); 
} 
void main() { 
    int[string] cool; 
    cool["ten"] = 10; 
    cool["twenty"] = 20; 
    import std.stdio; 
    writeln(cool.popitem()); 
    writeln(cool.popitem()); 
} 

Hoặc sử dụng byKeyValue:

auto popitem(K, V)(ref V[K] arr) { 
    foreach(item; arr.byKeyValue()) { 
     arr.remove(item.key); 
     return item; 
    } 
    throw new Exception("empty!"); 
} 
void main() { 
    int[string] cool; 
    cool["ten"] = 10; 
    cool["twenty"] = 20; 
    import std.stdio; 
    auto item = cool.popitem(); 
    writeln(item.key, item.value); 
    item = cool.popitem(); 
    writeln(item.key, item.value); 
} 

Nói chung, tôi muốn khuyến khích mọi người không để sợ viết các chức năng của chính họ. Nếu bạn có thể diễn tả điều gì đó với một vài thứ hiện có, chỉ cần viết chức năng của riêng bạn, đặt tên cho nó, và sử dụng nó! Với cú pháp gọi hàm đồng nhất, bạn có thể dễ dàng viết các phương thức mở rộng cho các kiểu dựng sẵn, như tôi đã làm ở đây, và sử dụng nó như thể nó luôn ở đó.

+0

Bạn không thể thay đổi mảng liên kết trong khi lặp qua nó. –

+0

Nó có thể không được xác định hành vi để tiếp tục, nhưng kể từ khi vòng lặp phá vỡ ngay lập tức, tôi không nghĩ rằng nó quan trọng. Tuy nhiên, bạn cũng có thể lưu trữ khóa và giá trị trong biến cục bộ sau đó ngắt khỏi vòng lặp trước khi xóa hoàn toàn chắc chắn. –

Các vấn đề liên quan