仅查找数组中最接近当前索引元素的值的相同值 dart/flutter



我有一个具有相同值的数组,所以我想只过滤它最接近当前索引的相同值,例如:

A[0] = 2, 
A[1] = -2, 
A[2] = -2, 
A[3] = 9, 
A[4] = 9,
A[5] = 9, 
A[6] = 4, 
A[7] = -2,
A[8] = -2,
A[9] = -2,

我希望我的代码可以找到索引12具有相同的值,该值与长度2-2, 索引345具有相同的值9长度3索引789具有相同的值-2长度3,我的代码将仅返回相同值范围内最接近索引0的长度,即值9

void main() {
var nInt = <ArrayA>[
ArrayA(e: 'A', n: 2),
ArrayA(e: 'A', n: -2),
ArrayA(e: 'A', n: -2),
ArrayA(e: 'A', n: 9),
ArrayA(e: 'A', n: 9),
ArrayA(e: 'A', n: 9),
ArrayA(e: 'A', n: -1),
ArrayA(e: 'A', n: 7),
ArrayA(e: 'A', n: -2),
ArrayA(e: 'A', n: -2),
ArrayA(e: 'A', n: -2),

for (var i = 0; i < nInt.length; i++) {
for (var j = i + 1; j < nInt.length; j++) {
if (nInt[j].n == nInt[i].n) {
} else {
break;
}
}
];
class ArrayA {
final String e;
final int n;
ArrayA({this.e, this.n});
@override
String toString() {
return '$n';
}
}

为了实现这一点,您需要将比较结果和最近的索引存储在某个地方。为此,您可以创建一个类,如下所示:

class Counter {
final int index;
final int number;
final int count;
Counter({required this.index, required this.number, required this.count});
@override
String toString() {
return '$count times $number at $index';
}
}

并将逻辑更改为:

var counterValues = <Counter>[];
for (var i = 0; i < nInt.length; i++) {
int count = 1;
int value = nInt[i].n;
for (var j = i + 1; j < nInt.length; j++) {
if (nInt[j].n == nInt[i].n) {
count += 1;
} else {
// Break the inner loop and go to next outer-loop iteration
// You can optimise this by skipping already checked positions (ie: Update i)
break;
}
}
counterValues.add(Counter(index: i, count: count, number: value));
}

最后,要找到最重复出现的最接近值,您可以使用 reduce:

var result =
counterValues.reduce((a, b) => (a.count >= b.count && a.index < b.index) ? a : b);
print(result); // Output: 3 times 9 at 3

最新更新