Home > Software design >  Flutter/Dart nested For & While loop behaving weirdly
Flutter/Dart nested For & While loop behaving weirdly

Time:09-08

I have a use case where I am using a nested For loop to make a new list from the internal loop and add its value to another list using the outer loop. Here is the code:

For loop version:

void main(List<String> arguments) {
  print('Hello world!');

  List sortedMapList = [1, 2, 3];
  List pickupPolyLineList = [4, 5, 6];
  List tempList = [];
  List wayPointsList = [];

  for (int i = 0; i <= sortedMapList.length; i  ) {
    tempList = pickupPolyLineList;
    for (int j = 0; j < i; j  ) {
      tempList.add(sortedMapList[j]);
      // print("tempList at internal index j: $j is: $tempList");
    }
    print(" Before wayPointsList at internal index i: $i is: $wayPointsList \n");

    wayPointsList.add(tempList);
    print(" after wayPointsList at internal index i: $i is: $wayPointsList");
  }
}

For loop version output:

Hello world!
 Before wayPointsList at internal index i: 0 is: [] 

 after wayPointsList at internal index i: 0 is: [[4, 5, 6]]
 Before wayPointsList at internal index i: 1 is: [[4, 5, 6, 1]] 

 after wayPointsList at internal index i: 1 is: [[4, 5, 6, 1], [4, 5, 6, 1]]
 Before wayPointsList at internal index i: 2 is: [[4, 5, 6, 1, 1, 2], [4, 5, 6, 1, 1, 2]] 

 after wayPointsList at internal index i: 2 is: [[4, 5, 6, 1, 1, 2], [4, 5, 6, 1, 1, 2], [4, 5, 6, 1, 1, 2]]

While loop version:

void main(List<String> arguments) {
  print('Hello world!');

  List sortedMapList = [1, 2, 3];
  List pickupPolyLineList = [4, 5, 6];
  List tempList = [];
  List wayPointsList = [];

  int i = 0;
  int j = 0;

  while (i < sortedMapList.length) {
    tempList = pickupPolyLineList;
   
    while (j < i) {
      tempList.add(sortedMapList[j]);
      // print("tempList at internal index j: $j is: $tempList");
      j  ;
    }
    print("tempList at internal index is: $tempList");
    print(" Before wayPointsList at internal index i: $i is: $wayPointsList");

    wayPointsList.add(tempList);
    print(" after wayPointsList at internal index i: $i is: $wayPointsList \n");
    i  ;
  }
}

While loop version output:

Hello world!
tempList at internal index is: [4, 5, 6]
 Before wayPointsList at internal index i: 0 is: []
 after wayPointsList at internal index i: 0 is: [[4, 5, 6]] 

tempList at internal index is: [4, 5, 6, 1]
 Before wayPointsList at internal index i: 1 is: [[4, 5, 6, 1]]
 after wayPointsList at internal index i: 1 is: [[4, 5, 6, 1], [4, 5, 6, 1]] 

tempList at internal index is: [4, 5, 6, 1, 2]
 Before wayPointsList at internal index i: 2 is: [[4, 5, 6, 1, 2], [4, 5, 6, 1, 2]]
 after wayPointsList at internal index i: 2 is: [[4, 5, 6, 1, 2], [4, 5, 6, 1, 2], [4, 5, 6, 1, 2]] 

The same code I wrote in Python seems to be working fine:

adj = [1, 2, 3]
fruits = [4, 5, 6]
fruits2 = []
tempList = []

for x in range(len(fruits)):
  tempList = fruits[:]
  for i in range(x):
    tempList.append(adj[i])
  fruits2.append(tempList)
  print(fruits2)

The output of the python code:

[[4, 5, 6]]
[[4, 5, 6], [4, 5, 6, 1]]
[[4, 5, 6], [4, 5, 6, 1], [4, 5, 6, 1, 2]]

CodePudding user response:

Your first problem is that you are not resetting tempList in every main loop, and second one is When you one copy a list by value you should use .addAll, Try this:

void testy() {
    print('Hello world!');

    List sortedMapList = [1, 2, 3];
    List pickupPolyLineList = [4, 5, 6];
    List tempList = [];
    List wayPointsList = [];

    for (int i = 0; i <= sortedMapList.length; i  ) {
      tempList = [];// <--- add this
      tempList.addAll(pickupPolyLineList);// <--- change this
      for (int j = 0; j < i; j  ) {
        tempList.add(sortedMapList[j]);
        // print("tempList at internal index j: $j is: $tempList");
      }
      print(
          " Before wayPointsList at internal index i: $i is: $wayPointsList \n");

      wayPointsList.add(tempList);
      print(" after wayPointsList at internal index i: $i is: $wayPointsList");
    }
  }

The output:

flutter: Hello world!
flutter:  Before wayPointsList at internal index i: 0 is: []
flutter:  after wayPointsList at internal index i: 0 is: [[4, 5, 6]]
flutter:  Before wayPointsList at internal index i: 1 is: [[4, 5, 6]]
flutter:  after wayPointsList at internal index i: 1 is: [[4, 5, 6], [4, 5, 6, 1]]
flutter:  Before wayPointsList at internal index i: 2 is: [[4, 5, 6], [4, 5, 6, 1]]
flutter:  after wayPointsList at internal index i: 2 is: [[4, 5, 6], [4, 5, 6, 1], [4, 5, 6, 1, 2]]
flutter:  Before wayPointsList at internal index i: 3 is: [[4, 5, 6], [4, 5, 6, 1], [4, 5, 6, 1, 2]]
flutter:  after wayPointsList at internal index i: 3 is: [[4, 5, 6], [4, 5, 6, 1], [4, 5, 6, 1, 2], [4, 5, 6, 1, 2, 3]]
  • Related