I have code example like this :
Here I want to access only unique pairs within the intArr list. I wanted to output like this ; [0, 0] [1, 1] [1, 2] [1, 3] For now, it doesn't matter if the pairs are in order from smallest to largest
CodePudding user response:
You would store the lists that you have already printed in a variable List<List<int>> alreadySeen
and check before printing if that variable contains the list to be printed.
void main() {
List<List<int>> intArr = [
[0, 0],
[1, 1],
[1, 1],
[1, 2],
[1, 3],
[1, 2],
];
List<List<int>> alreadySeen = [];
for (int i = 0; i < intArr.length; i ) {
if(!contains(alreadySeen, intArr[i])) {
print(intArr[i]);
alreadySeen.add(intArr[i]);
}
}
}
The function contains
would have 2 nested for loops, one to loop through the main list and the other to loop through the list we are searching for.
If the needle
values match a list in the main list, the variable found
stays true
and the function returns true
bool contains(List<List<int>> list, List<int> needle) {
if (list.length == 0 || needle.length == 0) return false;
for (int i = 0; i < list.length; i ) {
if (list[i].length != needle.length) continue;
bool found = true;
for(int j = 0; j < list[i].length; j ) {
if (list[i][j] != needle[j]) found = false;
}
if (found) return true;
}
return false;
}
Note that if you are using flutter there is a function named listEquals that would make the function contains
easier see this however you can't use the basefunction intArr.contains
since it will compare the reference
of the arrays and not their values
Working Jdoodle.
As @jamesdlin pointed out, if performance is important to you, you would use a LinkedHashSet instead of List<List> for alreadySeen
to make the contains
function O(1) instead of O(n).