সূচক এবং ডার্টে মান সহ একটি তালিকার মাধ্যমে অঙ্কিত বা মানচিত্র করুন


94

ডার্টে সাধারণের সমতুল্য যে কোনও:

enumerate(List) -> Iterator((index, value) => f)
or 
List.enumerate()  -> Iterator((index, value) => f)
or 
List.map() -> Iterator((index, value) => f)

দেখে মনে হচ্ছে এটি সহজতম উপায় তবে এটি এখনও অদ্ভুত বলে মনে হচ্ছে যে এই কার্যকারিতাটি বিদ্যমান থাকবে না।

Iterable<int>.generate(list.length).forEach( (index) => {
  newList.add(list[index], index)
});

সম্পাদনা করুন:

@ হেমন্ত-রাজকে ধন্যবাদ আমি যে সন্ধান করছি তার সন্ধান করতে পেরেছি। যার জন্য অনুরূপ কিছু করার দরকার আছে তার জন্য আমি এটি এখানে রাখব।

List<Widget> _buildWidgets(List<Object> list) {
    return list
        .asMap()
        .map((index, value) =>
            MapEntry(index, _buildWidget(index, value)))
        .values
        .toList();
}

বিকল্প হিসাবে আপনি পুনরাবৃত্তিযোগ্য ফিরে আসার জন্য একটি সিঙ্ক্রোনাস জেনারেটর ফাংশন তৈরি করতে পারেন

Iterable<MapEntry<int, T>> enumerate<T>(Iterable<T> items) sync* {
  int index = 0;
  for (T item in items) {
    yield MapEntry(index, item);
    index = index + 1;
  }
}

//and use it like this.
var list = enumerate([0,1,3]).map((entry) => Text("index: ${entry.key}, value: ${entry.value}"));

Map#forEach? এটা কি আপনি চান?
pskink

এটি ম্যাপ নয় একটি তালিকার মাধ্যমে গণনা করছে
ডেভিড রেস

মানচিত্র # forEach প্রতিটি মাধ্যমে গণনা করা হয় List? আপনি কি বোঝাতে চেয়েছেন? দস্তাবেজগুলি বলে: "মানচিত্রের প্রতিটি কী / মান জোড়ায় f প্রয়োগ হয় f কল করতে মানচিত্র থেকে কীগুলি যুক্ত বা অপসারণ করা উচিত নয়" "
pskink

"সূচক এবং মান সহ একটি তালিকা দিয়ে গণনা বা মানচিত্র" দিয়ে আপনি কী বোঝাতে চেয়েছেন তাও আমি বুঝতে পারি না
গন্টার জ্যাচবাউয়ার

4
@ গন্তেরজ্যাচবাউর গিথুব. com/ dart- lang/ sdk / issues
ম্যাট সি

উত্তর:


143

এমন একটি asMapপদ্ধতি রয়েছে যা তালিকাকে মানচিত্রে রূপান্তর করে যেখানে কীগুলি সূচক এবং মানগুলি সূচকের উপাদান। দয়া করে এখানে ডক্সটি দেখুন ।

উদাহরণ:

List _sample = ['a','b','c'];
_sample.asMap().forEach((index, value) => f);

আশাকরি এটা সাহায্য করবে!


34

পুনরাবৃত্তি সূচক পেতে কোনও অন্তর্নির্মিত ফাংশন নেই।

আমার মতো যদি আপনি Mapকেবল একটি সাধারণ সূচকের জন্য একটি (ডেটা স্ট্রাকচার) তৈরি করার ধারণা পছন্দ করেন না তবে আপনি সম্ভবত যা চান তা হ'ল map(ফাংশন) যা আপনাকে সূচক দেয়। আসুন এটি কল করুন mapIndexed(কোটলিনের মতো):

children: mapIndexed(
  list,
  (index, item) => Text("event_$index")
).toList();

বাস্তবায়ন mapIndexedসহজ:

Iterable<E> mapIndexed<E, T>(
    Iterable<T> items, E Function(int index, T item) f) sync* {
  var index = 0;

  for (final item in items) {
    yield f(index, item);
    index = index + 1;
  }
}

4
এটি একটি ভাল উত্তর তবে সম্ভবত একটি সুসংগত জেনারেটর হিসাবে আরও ভাল লেখা হবে
ডেভিড রিস

4
পরামর্শের জন্য @ ডেভিডরিস থেক্স! আমিও ফাংশন নতুন নামকরণmapIndexed
Vivien

এটি লজ্জার বিষয় যে ডার্টের এটি করার জন্য অন্তর্নির্মিত সহজ উপায় নেই। এমনকি 30 বছর বয়সী অজগর এটি সহজেই করতে পারে!
ওসামু

দেখা যাচ্ছে যে .asMap().forEach()মূলত এটির মতোই - আমার উত্তর দেখুন।
টিম্ম্ম্ম

4
@ টিমিএমএম আমি মনে করি asMap()তথ্য পুনরুদ্ধার করতে অতিরিক্ত লুপ ব্যয় করবে, সুতরাং এটি mapIndexed()উপরের মতো কার্যকর হবে না ।
এন্টিকাফে

17

@ হেমন্ত রাজ উত্তরের উপর বিল্ডিং।

এটিকে আবার রূপান্তর করতে আপনি করতে পারেন

List<String> _sample = ['a', 'b', 'c'];
_sample.asMap().values.toList(); 
//returns ['a', 'b', 'c'];

অথবা যদি কোনও ম্যাপিং ফাংশনের জন্য আপনার সূচকের প্রয়োজন হয় তবে আপনি এটি করতে পারেন:

_sample
.asMap()
.map((index, str) => MapEntry(index, str + index.toString()))
.values
.toList();
// returns ['a0', 'b1', 'c2']

14

ডার্ট ২.7 দিয়ে শুরু করে, আপনি সহায়ক পদ্ধতিগুলি লেখার পরিবর্তে extensionকার্যকারিতা প্রসারিত করতে ব্যবহার করতে পারেনIterable

extension ExtendedIterable<E> on Iterable<E> {
  /// Like Iterable<T>.map but callback have index as second argument
  Iterable<T> mapIndex<T>(T f(E e, int i)) {
    var i = 0;
    return this.map((e) => f(e, i++));
  }

  void forEachIndex(void f(E e, int i)) {
    var i = 0;
    this.forEach((e) => f(e, i++));
  }
}

ব্যবহার:

final inputs = ['a', 'b', 'c', 'd', 'e', 'f'];
final results = inputs
  .mapIndex((e, i) => 'item: $e, index: $i')
  .toList()
  .join('\n');

print(results);

// item: a, index: 0
// item: b, index: 1
// item: c, index: 2
// item: d, index: 3
// item: e, index: 4
// item: f, index: 5
inputs.forEachIndex((e, i) => print('item: $e, index: $i'));

// item: a, index: 0
// item: b, index: 1
// item: c, index: 2
// item: d, index: 3
// item: e, index: 4
// item: f, index: 5

4
এটি সর্বোত্তম উত্তর, এটি এমনকি ঝাঁকুনি আইটেমগুলির সাথেও কাজ করে যেখানে আপনি কেবল স্ট্রিংকেই নয় উইজেটগুলি ফিরিয়ে দিতে পারবেন।
স্টিল

7

লুকাশ রেংগলির আরও প্যাকেজে 'ইন্ডেক্সড' সহ অনেক দরকারী সরঞ্জাম রয়েছে যা আপনি যা চান ঠিক তা করে। ডক্স থেকে:

indexed(['a', 'b'], offset: 1)
  .map((each) => '${each.index}: ${each.value}')
  .join(', ');

(আপনার যদি ছোট্ট টাল ব্যাকগ্রাউন্ড না থাকে তবে আপনি অফসেট আর্গুমেন্ট উপেক্ষা করতে পারবেন :-)।


6

আমি প্রথমে ভেবেছিলাম ['one', 'two', 'three'].asMap().forEach((index, value) { ... });সত্যিই অদক্ষ হব কারণ দেখে মনে হচ্ছে এটি তালিকাটিকে মানচিত্রে রূপান্তর করছে। আসলে তা নয় - ডকুমেন্টেশন বলছে এটি তালিকার একটি অপরিবর্তনীয় দৃষ্টিভঙ্গি তৈরি করে। আমি dart2jsএই কোডটির সাথে ডাবল চেক করেছি :

void main() {
  final foo = ['one', 'two', 'three'];
  foo.asMap().forEach((idx, val) {
    print('$idx: $val');
  });
}

এটি প্রচুর কোড জেনারেট করে ! কিন্তু সংক্ষেপটি হ'ল:

  main: function() {
    var foo = H.setRuntimeTypeInfo(["one", "two", "three"], ...);
    new H.ListMapView(foo, ...).forEach$1(0, new F.main_closure());
  },

  H.ListMapView.prototype = {
    forEach$1: function(_, f) {
      var t1, $length, t2, i;
      ...
      t1 = this._values;
      $length = t1.length;
      for (t2 = $length, i = 0; i < $length; ++i) {
        if (i >= t2)
          return H.ioore(t1, i);
        f.call$2(i, t1[i]);
        t2 = t1.length;
        if ($length !== t2)
          throw H.wrapException(P.ConcurrentModificationError$(t1));
      }
    },
    ...
  },

  F.main_closure.prototype = {
    call$2: function(idx, val) {
      ...
      H.printString("" + idx + ": " + H.S(val));
    },
    $signature: 1
  };

সুতরাং দক্ষ জিনিসটি করার পক্ষে এটি যথেষ্ট স্মার্ট! খুব চতুর।

অবশ্যই আপনি লুপের জন্য কেবল একটি সাধারণ ব্যবহার করতে পারেন:

for (var index = 0; index < values.length; ++index) {
  final value = values[index];

4

সুবিধার জন্য আপনি এই এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন।

extension CollectionUtil<T> on Iterable<T>  {

  Iterable<E> mapIndexed<E, T>(E Function(int index, T item) transform) sync* {
    var index = 0;

    for (final item in this) {
      yield transform(index, item as T);
      index++;
    }
  }
}

2

প্রথমে মানচিত্রে তালিকা রূপান্তর করতে asMap ব্যবহার করুন । উপাদান সূচকের মূল। উপাদানটি মান হয়ে যায়। কীটি মানচিত্র করতে এন্ট্রিগুলি ব্যবহার করুন এবং আপনার যা কিছু চান তার মান দিন।

List rawList = ["a", "b", "c"];
List<String> argList = rawList.asMap().entries.map((e) => '${e.key}:${e.value}').toList();
print(argList);

আউটপুট:

[0:a, 1:b, 2:c]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.