Java检查增量/减量模式

问题描述 投票:-4回答:1

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

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

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

请注意它是如何从小>大>小>小>小等等?

如果可能,我该如何检测这种模式,以及最有效的方法。

谢谢!

java deque
1个回答
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是输入列表中元素的数量。我们不能做得比这更好,因为我们需要访问列表的每个元素(除了最后一个)以检查是否满足条件。

© www.soinside.com 2019 - 2024. All rights reserved.