我的问题/问题(两者都是)我想通过列表检查Java中的增量模式。
我的意思基本上就是说我有一个10个样本值的浮点数列表(或者双打,或者是whantnot),其中包含以下值:
3.2675781, 3.2800293, 3.232666, 3.1662598, 3.0898438, 3.0302734, 3.0253906, 2.9074707, 2.9343262, 2.9179688
请注意它是如何从小>大>小>小>小等等?
如果可能,我该如何检测这种模式,以及最有效的方法。
谢谢!
你只需要一个通用的方法来做到这一点。
我们的想法是采用自定义的Comparator
,让你比较类型,或者你的类型应该是可比较的(应该实现Comparable
)。
以下代码显示了这一点:
public <T extends Comparable<T>> boolean checkPattern(List<T> list) {
return checkPattern(list, T::compareTo);
}
public <T> boolean checkPattern(List<T> list, Comparator<T> comparator) {
// assuming null/empty/list with 1 element satisfy the pattern
if (list == null || list.size() == 0 || list.size() == 1)
return true;
if (comparator.compare(list.get(0), list.get(1)) >= 0)
return false;
for (int i = 1; i < list.size() - 1; i++) {
T current = list.get(i);
T next = list.get(i + 1);
if (comparator.compare(current, next) <= 0) {
System.out.println(current + " " + next);
return false;
}
}
return true;
}
你可以这样称呼它:
System.out.println(new Test().checkPattern(Arrays.asList(3.2675781, 3.2800293, 3.232666, 3.1662598, 3.0898438, 3.0302734, 3.0253906, 2.9074707, 2.9343262, 2.9179688)));
而这个输出将是:
false
因为2.9074707 < 2.9343262
。
谈到效率,上述解决方案的渐近复杂性是O(n)
,其中n
是输入列表中元素的数量。我们不能做得比这更好,因为我们需要访问列表的每个元素(除了最后一个)以检查是否满足条件。