Naples
Naples

Reputation: 29

Monotonic Functions in Java of Comparables

I am trying to implement an algorithm that checks if an array of comparable elements is increasing or decreasing. So far I have written this method:

class Solution {
    public boolean isMonotonic(int[] A) {
        int store = 0;
        for (int i = 0; i < A.length - 1; ++i) {
            int c = Integer.compare(A[i], A[i+1]);
            if (c != 0) {
                if (c != store && store != 0)
                    return false;
                store = c;
            }
        }

        return true;
    }
}

I changed the method signature, by passing a generic method of comparables, but I'm struggling to implement the compareTo method. I am probably using the bounded generics wrong, but I'm not too sure?

My attempt:

public boolean Test(T[] n) 
    {
        if (n.length < 3)
            return true;

        int direction = n[0].compareTo(n[1]);
        for (int i = 1; i < n.length-1; i++){
            int step = n[i].compareTo(n[i+1]); 
            if (step == 0)
                continue;

            if (direction == 0)
                direction = step;
            else if  ( sdtep < 0 && direction > 0
                    || step > 0 && direction < 0)
                return false;

        }

        return true;                
    }

Upvotes: 1

Views: 259

Answers (3)

mhdirnjbr
mhdirnjbr

Reputation: 1

Strictly monotone function:

public static boolean isMonotone(int[] a) {
    boolean monotone = true;
    if(a[0]>a[1]) {
        for(int i=0;i<(a.length-1);i++) {
            if(!(a[i]>a[i+1])){
                monotone=false;
            }
        }
    }
    if(a[0]<a[1]) {
        for(int i=0;i<(a.length-1);i++) {
            if(!(a[i]<a[i+1])){
                monotone=false;
            }
        }
    }
    if(a[0]==a[1]) return false;
    return monotone;
    
}

Upvotes: 0

mhdirnjbr
mhdirnjbr

Reputation: 1

Monotone function:

public static boolean isMonotone(int[] a) {
    boolean monotone = true;
    int i=0;
    while(a[i]==a[i+1]) {
        i++;
    }
    if(a[i]>a[i+1]) {
        for(int j=0;j<(a.length-1);j++) {
            if(!(a[j]>=a[j+1])){
                monotone=false;
            }
        }
    }
    if(a[i]<a[i+1]) {
        for(int j=0;j<(a.length-1);j++) {
            if(!(a[j]<=a[j+1])){
                monotone=false;
            }
        }
    }
    return monotone;
}

Upvotes: 0

Martin Heraleck&#253;
Martin Heraleck&#253;

Reputation: 5789

In order to make your method take a generic argument, change its header:

public static <T extends Comparable<? super T>> boolean isMonotonic(T[] A)

You can then compare items of the array using the Comparable::compareTo method:

int c = A[i].compareTo(A[i+1]);

Upvotes: 3

Related Questions