简体   繁体   中英

Sorting array using binarySearch

I just want to ask if why am I still getting null pointer on my function sortInOrder(Object x) .

What I am trying to do is use sortInOrder to insert Objects in my data[] array in ascending order.

public Object[] data = new Object[10];

public static void main(String[] args) {

    for (int i = 0; i < 5; i++)
    {
        int r = (int) (Math.random() * 100);
        System.out.println("Adding " + r);
        sortInOrder(r);

        for (int j = 0; j <= 10; j++)
            System.out.println((Integer) data[j]);
    }

    for (int i = 0; i < 10; i++)
        System.out.println((Integer) data[i]);
}

public static void sortInOrder(Object x) {
    if (x == null)
        throw new IllegalArgumentException();

    int idx = 0;
    if ( data[idx] != null ) 
        idx = Arrays.binarySearch(data, 0, data.length-1, ((Integer) data[idx]).compareTo((Integer) x));

    for ( int i = idx + 1 ; i < data.length - 1 ; i++ )
        data[i] = data[ i - 1 ];

    data[idx] = x;
}

I have fixed your code. Please note that the return value of binarySearch method is:

"index of the search key, if it is contained in the array within the specified range; otherwise, (-(insertion point) - 1)" (source )

import java.util.Arrays;
import java.util.Comparator;

public class Q1 {

    public static Object[] data = new Object[10];

    public static void main(String[] args) {

        for (int i = 0; i < 5; i++) {
            int r = (int) (Math.random() * 100);
            System.out.print("Adding: " + r);
            sortInOrder(r);

            System.out.print("[");
            for (int j = 0; j < 10; j++)
                System.out.print(" " + data[j]);
            System.out.println(" ]");
        }

        System.out.print("[");
        for (int i = 0; i < 10; i++)
            System.out.print(" " + data[i]);
        System.out.print(" ]");
    }

    public static void sortInOrder(Integer x) {
        if (x == null)
            throw new IllegalArgumentException();

        int idx = Arrays.binarySearch(data, 0, data.length - 1, x, Comparator.nullsLast((Object o1, Object o2) -> ((Integer) o1) - ((Integer) o2)));

        if (idx < 0) idx = -idx - 1;
        System.out.println(" at index: " + idx);

        // Hint: Use arraycopy instead of for loop for better performance
        System.arraycopy(data, idx, data, idx + 1, data.length - 1 - idx);

        data[idx] = x;
    }

}

Alternatively You can use an anonymous class instead of lambda:

int idx = Arrays.binarySearch(data, 0, data.length - 1, x, 
    Comparator.nullsLast(new Comparator<Object>() {
        @Override
        public int compare(Object o1, Object o2) {
            return ((Integer) o1) - ((Integer) o2);
        }
    }));

Result:

Adding: 2 at index: 0
[ 2 null null null null null null null null null ]
Adding: 29 at index: 1
[ 2 29 null null null null null null null null ]
Adding: 88 at index: 2
[ 2 29 88 null null null null null null null ]
Adding: 9 at index: 1
[ 2 9 29 88 null null null null null null ]
Adding: 27 at index: 2
[ 2 9 27 29 88 null null null null null ]
[ 2 9 27 29 88 null null null null null ]
Process finished with exit code 0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM