Java检查增量/减量模式

时间:2019-02-26 18:13:27

标签: java deque

我的问题/问题(实际上都是)是我想通过列表检查Java中的增量模式。

基本上,我的意思是说我有一个包含以下值的10个浮点数(或双倍数或whantnot)样本列表:

  

3.2675781、3.2800293、3.232666、3.1662598、3.0898438、3.0302734、3.0253906、2.9074707、2.9343262、2.9179688

请注意它是如何从小>大>小>小>小等开始的。

如果可能的话,我该如何检测到这种模式?最有效的方法是什么。

谢谢!

1 个答案:

答案 0 :(得分:0)

您只需要一个通用方法即可。

这个想法是采用一个自定义的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是输入列表中元素的数量。我们不能做得更好,因为我们需要访问列表中的每个元素(最后一个元素除外),以检查是否满足条件。